Apache Spark 初学者笔记

首先

我开始参与使用Amazon EMR和Apache Spark来汇总报告数据的工作,但由于有太多我不懂的术语,所以我想简要总结一下基础知识部分。

Apache Hadoop的分布式处理架构

 2018-07-20 12.23.15.png

使用Amazon Elastic MapReduce(Amazon EMR),可以启动Hadoop集群,通过该集群可以实现Hadoop分布式资源管理、处理和存储。

■ 资源管理
Apache Mesos、Hadoop Yarn

■ 处理
Hadoop MapReduce 是一种数据处理框架,而Apache Spark 则是另一种。

■ 存储
HDFS,S3

存储和数据库

Hadoop将获取日志文件等并存储在存储中。

■ HDFS
在Hadoop上使用的分布式文件系统
在加载数据文件时,会将其分散到每个128MB(默认值)的块中
每个块会被复制到3个节点(默认值),在多个节点上进行存储
元数据(存储位置)由NameNode在单一节点上进行维护
因此,需要始终使NameNode守护程序保持运行状态
采用一次写入多次读取的模型
使用Java编写

■ Apache HBase
是在HDFS上构建的分布式NoSQL数据库
可以扩展并适应大量数据

获取数据

■ Apache Sqoop
Apache Sqoop能够双向导入HDFS和数据库的数据
可以将数据以多种格式导入HDFS
数据会通过Hadoop的MapReduce进行写入

■ Apache Flume
将数据单方向流向HDFS

■ Apache Kafka比Flume更具功能
发布-订阅模型

HDFS的文件格式

■ 文字檔
寫入速度很快
不依賴特定的程式設計語言
處理二進制檔案比較困難,但因為是文字檔所以容易閱讀
效能較差

■ SequenceFile
以字节序列的形式存储键值对
适用于MapReduce处理
性能很好

■ AvroFile(Apache Avro)
快速进行序列化和反序列化
对模式的更改具有良好的适应性
被广泛采用于Hadoop生态系统中
文件具有模式的元数据
由于是二进制数据,可以使用avro-tools来处理模式和数据
性能出色

Apache Parquet是一种以列型方式存储数据的文件格式。
由于相同类型的数据被存储在列方向上,所以其性能和压缩率都非常好。
然而,对于提取、更新和删除特定行来说并不擅长。
文件中还包含了模式的元数据。
由于是二进制数据,可以使用parquet-tools来处理模式和数据。
具有高性能。

Hadoop 扩展资源调度和管理(YARN)

另一种资源协商者的缩写
用于管理Hadoop集群的资源调度

 2018-07-27 14.39.18.png

主节点
– 在集群中仅存在一个
– 运行资源管理器(图中为RM)守护程序
⇒ 协调集群中可用节点之间的应用程序竞争,并决定何时分配资源
– 运行HDFS名称节点(图中为NN)守护程序
⇒ 管理数据节点的元数据

■ 核心节点
· 仅适用于EMR的概念
· 每个集群至少需要一个核心节点
· 运行节点管理器(图中为NM)守护进程
⇒ 与资源管理器(RM)通信,管理节点资源并启动容器
· 运行HDFS数据节点(图中为DN)守护进程
⇒ 保存HDFS数据的实体
· 执行Spark

■ 任务节点
– 任务是可选项。
– 执行节点管理器(图中为NM)守护进程。
⇒ 与资源管理器(RM)进行通信,管理节点资源并启动容器。
– 执行Spark任务。

Hadoop 分布式数据处理框架

如果实现了Map处理和Reduce处理,Hadoop会在分布式环境中进行处理。

■ 地图
逐个处理一条记录
创建键值对的组合

在Map输出后进行操作
将实现聚合处理等

以下是使用MapReduce计算并输出英文文本中单词数量的示例。

 2018-08-01 18.03.18.png

由于每个Map是独立的(不共享变量等),因此可以分布式并行处理。
在Reduce中,将具有相同键的项聚合并处理(在此处进行求和)。
如果Reduce的键也不相同,则可以进行分布式并行处理。

Apache Spark 是一个开源的大数据处理框架。

在Hadoop集群上运行并处理HDFS上的数据,比MapReduce更快。与MapReduce将数据保存在磁盘上不同,Spark将数据保存在内存中,并使用Scala编写的。

 2018-07-27 19.35.21.png

■ 容器
・从YARN启动
・将资源(内存和CPU核心)分配给节点

■ 应用程序主节点
・资源管理器向节点管理器请求分配用于应用程序主节点的容器并进行创建
・每个应用程序都分配一个应用程序主节点

■ Spark驱动程序
– 启动Spark应用程序的进程
– 在Application Master中启动(在YARN集群模式下)
– 如果在YARN客户端模式下,则由客户端启动驱动程序
– 将任务发送给执行器

■ 执行器
• 按照以下流程启动:
① 应用主管向资源管理器请求获取执行器启动所需资源
② 如果成功获取,应用主管将请求执行器启动的任务提交至节点管理器
③ 节点管理器启动执行器
• 成为实际执行任务的线程

Spark应用程序的配置

 2018-08-03 19.35.57.png

红框:应用程序
由一个驱动程序管理的作业集合

蓝框:工作
任务的集合

绿框:舞台
同时进行中的任务集合的可并列的选项

橙色框:任务
发送到一个执行者的工作单位

弹性分布式数据集 (RDD)

在Spark中,我们使用RDD来存储和操作数据。这是一个不可变的分布式集合。

操作RDD数据的方法有两种,转换(Transformations)和行动(Actions)。

■ 转换
由于RDD是不可变的,若要进行修改,需要创建一个新的RDD。
在创建新的RDD(进行转换)时,支持使用filter、map等函数。
以下是可用于转换的函数列表。

■ 动作
为RDD提供对count、reduce等函数的支持
可用于动作的函数列表

RDD中的数据在执行操作之前不会被处理,因为转换是延迟评估的(只保存指示发起了该操作的元数据)。
只有执行操作之后,转换才会被执行。

Spark SQL-中文-custom transformer

使用类似于SQL的函数,可以操作RDD
Spark SQL的入口点是SQLContext
SQLContext是通过使用SparkContext来生成的。

使用抽象化的数据结构DataFrame来操作,DataFrame也是不可变的,这个结构抽象了RDD。

广告
将在 10 秒后关闭
bannerAds