任务调度分为两个主要模块:DAGScheduler和TaskScheduler。
它们负责将用户提交的计算任务按照DAG划分为不同的阶段并且将不同阶段的计算任务提交到集群进行最终的计算,整个过程如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/65bbf9bdc6eb931c25974fcd6ebe586f.png)
在Spark应用启动时,会初始化SparkContext对象。在SparkContext中,会创建SchedulerBackend、DAGScheduler、TaskScheduler。
具体涉及三个主要类:
- DAGScheduler:前面图示(DAG的阶段划分)中的源码即是它。负责分析用户提交的应用,并根据计算任务的依赖关系建立DAG,且将DAG划分为不同的Stage,每个Stage可并发执行一组Task。最终触发DAGScheduler.runJob()。
- TaskScheduler:DAGScheduler将划分完成的Task(一组任务TaskSet)提交到TaskScheduler,TaskScheduler通过Cluster Manager在集群中的某个Worker的Executor上启动任务。职责如下:
· 为TaskSet创建和维护一个TaskSetManager并追踪任务的本地性以及错误信息。
· 遇到Straggle任务会放到其他的节点进行重试。
· 向DAGScheduler汇