Bootstrap

Spark详细剖析

1. Application/App:Spark应用程序

指的是用户编写的Spark应用程序/代码,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。

Spark应用程序,由一个或多个作业JOB组成(因为代码中可能会调用多次Action),如下图所示:

 

 

 

2.  Driver:驱动程序

Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。

在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;

当Executor部分运行完毕后,Driver负责将SparkContext关闭。

通常SparkContext代表Driver,如下图所示:

 

 

 

3.  Cluster Manager:资源管理器

指的是在集群上获取资源的外部服务,常用的有:

Standalone,Spark原生的资源管理器,由Master负责资源的分配;

Haddop Yarn,由Yarn中的ResourcesManager负责资源的分配;

Messos,由Messos中的Messos Master负责资源管理,

如下图所示:

 

 

4.  Worker:计算节点

集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。

在Standalone模式中指的就是通过Slave文件配置的Worker节点,

在Spark on Yarn模式中指的就是NodeManager节点,

在Spark on Messos模式中指的就是Messos Slave节点,

如下图所示:

 

 

 

 

 

5.  Executor:执行器

Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,

每个Application都有各自独立的一批Executor,

注意:一个完整的Spark任务提交给Worker之后会在Worker上开启一个Executor进程,该进程中可以运行作用在各个分区上的多个Task(线程)

一个Executor进程中可以运行多个Task线程

如下图所示:

 

 

 

 

6.  RDD:弹性分布式数据集

Resillient Distributed Dataset,Spark的基本计算单元,可以通过一系列算子进行操作(主要有Transformation和Action操作),

如下图所示:

 

 

 

7.  NarrowDependency窄依赖

父RDD一个分区被子RDD的一个分区所依赖;

如图所示:

 

 

 

8.  ShuffleDependency宽依赖

父RDD的一个分区都被子RDD多个分区所使用/依赖

如图所示:

 

 

 

●常见的窄依赖有:

map、filter、union、mapPartitions、mapValues、join(父RDD是宽依赖)、笛卡尔积

●常见的宽依赖有:

groupByKey、partitionBy、reduceByKey、join(父RDD是窄依赖)

 

 

9.  DAG:有向无环图

Directed Acycle graph,反应RDD之间的依赖关系,

DAG其实就是一个JOB(会根据依赖关系被划分成多个Stage)

注意:一个Spark程序会有1~n个DAG,调用一次Action就会形成一个DAG

如图所示:

 

 

 

 

10.  DAGScheduler:有向无环图调度器

基于DAG划分Stage并以TaskSet的形式提交Stage给TaskScheduler;

负责将作业拆分成不同阶段的具有依赖关系的多批任务;

最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。

在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。

●总结:DAGScheduler完成以下工作:

1. DAGScheduler划分Stage(TaskSet),记录哪个RDD或者Stage输出被物化(缓存),通常在一个复杂的shuffle之后,通常物化一下(cache、persist),方便之后的计算。

2. 重新提交出错/失败的Stage(shuffle输出丢失的stage/stage内部计算出错)

3. 将Taskset传给底层调度器

ü spark-cluster TaskScheduler

ü yarn-cluster YarnClusterScheduler

ü yarn-client YarnClientClusterScheduler