1、DagScheduler分析
DagScheduler功能主要是负责RDD的各个stage的分解和任务提交。Stage分解是从触发任务调度过程的finalStage开始倒推寻找父stage,如果父stage没有提交任务则循环提交缺失的父stage。每个stage有一个父RDD的概念,根据分区数的多少创建多个任务(Task)。
Task的调度实际是通过TaskSchedulerImp来完成的,TaskSchedulerImp里根据环境部署的不同又会使用不同的Backend,比如Yarn集群、独立集群等其Backend是不一样的,这里先有个概念,先不深究Backend。
这里先看看DagScheduler的核心逻辑把。里面首先要研究的一个方法:
defsubmitMissingTasks(stage:Stage,jobId:Int)
该方法就是提交stage执行,为什么叫这个名称呢?说明这里的stage是需先需要提交执行的,没有其他依赖的stage还未执行了。
submitMissingTasks方法会根据RDD的依赖关系创建两种task,ResultTask和ShuffleMapTask。
一步步来,只看关键代码,因为整体代码太多了不利于理解关键逻辑。
1.1 生成序列化的taskBinary
taskBinaryBytes = stage match {
case stage: ShuffleMapStage =>
JavaUtils.bufferToArray(
closureSerializer.serialize((stage.rdd, stage.shuffleDep): AnyRef))
case stage: ResultStage &