一.了解Spark架构

1.客户端:用户提交作业的客户端。

2.Driver:主运用程序,该进程运行应用的 main() 方法并且创建 SparkContext。

3.SparkContext:应用上下文,控制整个生命周期。

4.Cluster manager:集群资源管理器(例如,Standlone Manager,Mesos,YARN)。

5.Spark Worker:集群中任何可以运行应用程序的节点,运行一个或多个Executor进程。

6.Executor:位于工作节点上的应用进程,负责执行计算任务并且将输出数据保存到内存或者磁盘中。

7.Task:被发送到 Executor 中的工作单元。

二.了解Spark作业运行流程

Spark有3种运行模式,即Standalone,YARN和Mesos。

1.Standalone模式

客户端提交作业给Master,Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。另外,Master还会让其余Worker启动Executor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序生成执行计划,并调度执行。对于每个Stage的Task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报时把TaskScheduler中的Task调度到ExecutorBackend执行。所有Stage都完成后作业结束。

程序执行过程中,由Worker节点向Master发送心跳,随时汇报Worker的健康状况。

2.YARN模式

1.YARN集群模式的作业运行流程

基于YARN的Spark作业首先由客户端生成作业信息,提交给ResourceManager,ResourceManager在某一NodeManager汇报时把AppMaster分配给NodeManager,NodeManager启动SparkAppMaster,SparkAppMaster启动后初始化作业,然后向ResourceManager申请资源,申请到相应资源后SparkAppMaster通过RPC让NodeManager启动相应的SparkExecutor,SparkExecutor向NodeManager上的SparkAppMaster汇报并完成相应的任务。

2.YARN客户端模式的作业运行流程

基于YARN的Spark作业首先由客户端生成作业信息,提交给ResourceManager,ResourceManager在某一NodeManager汇报时把AppMaster分配给NodeManager,NodeManager启动SparkAppMaster,SparkAppMaster启动后初始化作业,然后向ResourceManager申请资源,申请到相应资源后SparkAppMaster通过RPC让NodeManager启动相应的SparkExecutor,SparkExecutor向本地启动的SparkAppMaster汇报并完成相应的任务。

三.了解Spark核心数据集RDD

RDD全称叫做ResilientDistributedDatasets,直译为弹性分布式数据集,是spark中非常重要的概念。RDD是一个数据的集合,这个数据集合被划分成了许多的数据分区,而这些分区被分布式地存储在不同机器的内存或磁盘当中。

1.常用的转换算子

map(func): 将原 RDD 中的每个元素传递给函数 func,得到一个新的 RDD。

flatMap(func): 与 map 类似,但每个元素都可以生成多个输出,这些输出被平铺(flattening)成一个新的 RDD。

filter(func): 返回输入 RDD 中通过函数 func 的筛选结果为 true 的元素。

distinct([numTasks])): 返回输入 RDD 中所有不同的元素,可选参数 numTasks 指定任务的数量。

union(otherRDD): 返回对输入 RDD 和参数 RDD 执行联合操作的结果,生成一个新的 RDD,不去重。

intersection(otherRDD)): 返回对输入 RDD 和参数 RDD 执行交集操作的结果,生成一个新的 RDD。

subtract(otherRDD): 返回对输入 RDD 和参数 RDD 执行差集操作的结果,生成一个新的 RDD。

cartesian(otherRDD): 返回对输入 RDD 和参数 RDD 执行笛卡尔积的结果,生成一个新的 RDD。

2.常用的行动算子

reduce(func): 使用函数 func 组合 RDD 中的所有元素,返回计算结果。

collect(): 将 RDD 中的所有元素都返回给驱动程序程序。

count(): 返回 RDD 中元素的数量。

first(): 返回 RDD 的第一个元素。

take(n): 返回 RDD 的前 n 个元素。

takeSample(withReplacement, num, [seed]): 从 RDD 中随机取样 num 个元素,withReplacement 指定是否允许取样后返回的元素有重复,seed 指定随机数种子。

takeOrdered(n, [ordering]): 返回包含 RDD 前 n 个元素的列表,元素是按顺序排序的。

aggregate(zeroValue, seqOp, combOp): 使用给定的函数对 RDD 的元素进行聚合,seqOp 计算在分区中初始值到中间结果的聚合计算,而 combOp 在节点上对中间结果进行聚合。

fold(zeroValue, func): 与 aggregate 类似,但这里的 seqOp 和 combOp 相同。

foreach(func): 对 RDD 中的每个元素执行指定的函数。

四.了解Spark核心原理

Spark Stage划分依据主要是基于Shuffle。

Shuffle是产生宽依赖RDD的算子。

即Stage划分基于数据依赖关系的。

1.窄依赖

窄依赖:表现为一个父RDD的分区对应于一个子RDD的分区或者多个父RDD的分区对应于一个子RDD的分区。

2.宽依赖

宽依赖:表现为存在一个父RDD的一个分区对应一个子RDD的多个分区。