Spark的基本工做流程(未)

Spark的应用分为任务调度和任务执行两个部分,全部的Spark应用程序都离不开SparkContext和Executor两部分,Executor负责执行任务,运行Executor的机器称为Worker节点,SparkContext由用户程序启动,经过资源调度模块和Executor通讯。算法

具体来讲,以SparkContext为程序运行的总入口,在SparkContext的初始化过程当中,Spark会分别建立DAGScheduler做业调度和TaskScheduler任务调度两级调度模块。网络

 

其中DAGScheduler是基于任务阶段的高层调度模块,它为每一个Spark做业计算具备依赖关系的多个调度阶段(一般根据shuffle来划分),而后为每一个阶段构建出一组具体的任务(一般会考虑数据的本地性等),而后以TaskSets(任务组)的形式提交给TaskScheduler来具体执行。而TaskScheduler则负责具体启动任务、监控和汇报任务运行状况fetch

 

 

(1)在Driver端初始化SparkContext。任何spark的应用程序都包含Driver代码和Executor代码。Spark应用程序首先在Driver初始化SparkContext。由于SparkCotext是Spark应用程序通往集群的惟一路径,在SparkContext里面包含了DAGScheduler和TaskScheduler两个调度器类。在建立SparkContext对象的同时也自动建立了这两个类。优化

(2)SparkContext初始化完成后,首先根据Spark的相关配置,向Cluster Master申请所须要的资源,而后在各个Worker结点初始化相应的Executor。Executor初始化完成后,Driver将经过对Spark应用程序中的RDD代码进行解析,生成相应的RDD graph(RDD图),该图描述了RDD的相关信息及彼此之间的依赖关系。spa

(3)RDD图构建完毕后,Driver将提交给DAGScheduler进行解析。DAGScheduler在解析RDD图的过程当中,当遇到Action算子后将进行逆向解析,根据RDD之间的依赖关系以及是否存在shuffle等,将RDD图解析成一系列具备前后依赖关系的Stage。Stage以shuffle进行划分,即若是两个RDD之间存在宽依赖的关系,DAGScheduler将会在这RDD之间拆分为两个Stage进行执行,且只有在前一个Stage(父Stage)执行完毕后,才执行后一个Stage。线程

(4)DAGScheduler将划分的一系列的Stage(TaskSet),按照Stage的前后顺序依次提交给底层的调度器TaskScheduler去执行。对象

(5)TaskScheduler接收到DAGScheduler的Stage任务后,将会在集群环境中构建一个 TaskSetManager 实例来管理Stage(TaskSet) 的生命周期。blog

(6)TaskSetManager将会把相关的计算代码、数据资源文件等发送到相应的Executor上,并在相应的Executor上启动线程池执行。TaskSetManager在执行过程当中,使用了一些优化的算法,用于提升执行的效率,譬如根据数据本地性决定每一个Task最佳位置、推测执行碰到Straggle任务须要放到别的结点上重试、出现shuffle输出数据丢失时要报告fetch failed错误等机制。生命周期

(7)在Task执行的过程当中,可能有部分应用程序涉及到I/O的输入输出,在每一个Executor由相应的BlockManager进行管理,相关BlockManager的信息将会与Driver中的Block tracker进行交互和同步。进程

(8)在TaskThreads执行的过程当中,若是存在运行错误、或其余影响的问题致使失败,TaskSetManager将会默认尝试3次,尝试均失败后将上报TaskScheduler,TaskScheduler若是解决不了,再上报DAGScheduler,DAGScheduler将根据各个Worker结点的运行状况从新提交到别的Executor中执行。

(9)TaskThreads执行完毕后,将把执行的结果反馈给TaskSetManager,TaskSetManager反馈给TaskScheduler,TaskScheduler再上报DAGScheduler,DAGScheduler将根据是否还存在待执行的Stage,将继续循环迭代提交给TaskScheduler去执行。

(10)待全部的Stage都执行完毕后,将会最终达到应用程序的目标,或者输出到文件、或者在屏幕显示等,Driver的本次运行过程结束,等待用户的其余指令或者关闭。

(11)在用户显式关闭 SparkContext后,整个运行过程结束,相关的资源被释放或回收。

从以上工做流程上能够看出,全部的Spark程序都离不开SparkContext和Executor两部分,每一个Spark Application都有本身的Executor进程,此进程的生命周期和整个Application的生命周期相同,此进程内部维持着多个线程来并行地执行分配给它的Task。这种运行形式有利于不一样Application之间的资源调度隔离,但也意味着不一样的Application之间难以作到相互通讯和信息交换。同时须要注意因为Driver负责全部的任务调度,因此他应该尽量地靠近Worker结点,若是能在一个网络环境中那就更好了。

相关文章
相关标签/搜索