上篇文章主要从Stage的划分上对DAGScheduler的源码进行剖析,本文对划分成若干Stage之后,对这些Stage提交到TaskScheduler进行解析。
在Stage提交的过程中,对每一个Stage遍历,首先提交没有父Stage的作业,然后提交该Stage。通过这种方式可以是父Stage先执行,然后获取父Stage的结果执行下一个Stage。
首先将提交的作业根据最后一个RDD,创建finalStage,然后根据jobid,rdd,finalStage创建一个ActiveJob,用于记录当前DAGScheduler中执行执行的job,然后根据该finalStage的信息选择响应的执行方式(本地执行或者提交到集群执行),然后调用submitStage()提交该Stage。提交完Stage后不要忘记还有一个submitWaitingStage(),用于提交所有处于等待状态的Stage。
在调用submitStage方法中,首先检查该stage对应的job是否是active状态(有可能在提交过程中该job的所有stage被取消),然后根据判断该stage 状态,如果不是等待,正在执行,失败状态,首先获取该Stage的所有未提交的Stage,如果不存在未提交的父Stage,则提交当前的Stage,否则提交父Stage,当前的Stage处于等待状态。
在submitMissingTask中根据Stage的不同,创建响应的Task(ShuffleMapTask,ResultTask),需要注意的是每一个Partition创建一个Task,在创建Task的过程中,会给该Task计算preferred location,然后保存到Task中,传递给TaskScheduler。
到目前为止DAGScheduler完成了本次job的提交过程。
DAGScheduler除了以上剖析的之外,还有一些其他的作用。比如,由于shuffle输出文件丢失导致失败的任务等,会在后面的博客中进行解析。