大数据之Spark(七):Spark 任务调度

任务调度分为两个主要模块:DAGScheduler和TaskScheduler。
它们负责将用户提交的计算任务按照DAG划分为不同的阶段并且将不同阶段的计算任务提交到集群进行最终的计算,整个过程如下图所示:

大数据之Spark(七):Spark 任务调度_第1张图片 任务调度逻辑视图

 

在Spark应用启动时,会初始化SparkContext对象。在SparkContext中,会创建SchedulerBackend、DAGScheduler、TaskScheduler。
具体涉及三个主要类:

  1. DAGScheduler:前面图示(DAG的阶段划分)中的源码即是它。负责分析用户提交的应用,并根据计算任务的依赖关系建立DAG,且将DAG划分为不同的Stage,每个Stage可并发执行一组Task。最终触发DAGScheduler.runJob()。
  2. TaskScheduler:DAGScheduler将划分完成的Task(一组任务TaskSet)提交到TaskScheduler,TaskScheduler通过Cluster Manager在集群中的某个Worker的Executor上启动任务。职责如下:
    · 为TaskSet创建和维护一个TaskSetManager并追踪任务的本地性以及错误信息。
    · 遇到Straggle任务会放到其他的节点进行重试。
    · 向DAGScheduler汇报执行情况,包括在Shuffle输出lost的时候报告fetch failed错误等信息。

SchedulerBackend:每个TaskScheduler对应一个SchedulerBackend(CoarseGrainedSchedulerBackend、StandaloneSchedulerBackend、LocalSchedulerBackend),作用是分配当前可用的资源,具体就是向当前等待分配计算资源的Task分配计算资源(Executor),并在分配的Executor上启动Task,完成计算的调度过程。

大数据之Spark(七):Spark 任务调度_第2张图片 TaskScheduler

 

Spark中的任务分为两种: ShuffleMapTaskResultTask
1)ShuffleMapTask:任务所在Stage不是最后一个Stage,即ShuffleMapState。对于非最后的Stage,会根据每个Stage的分区数量来生成ShuffleMapTask。ShuffleMapTask会根据下游Task的分区数量和Shuffle策略来生成一系列文件。
2)ResultTask:任务所在Stage是最后一个Stage,即ResultStage。对于最后一个Stage,会根据生成结果的分区来生成与分区数量相同的ResultTask,然后ResultTask将计算结果汇报到Driver端。如下图所示:
大数据之Spark(七):Spark 任务调度_第3张图片 org.apache.spark.scheduler.DAGScheduler #submitMissingTasks

 上图显示了ShuffleMapTask&ResultTask的创建时机(阶段划分中)。

 

你可能感兴趣的:(#,Spark,spark)