介绍提交Stage的流程,继续沿用Spark DAG之划分Stage中的例子。
上篇博客Spark DAG之划分Stage介绍了划分Stage的流程,举的例子最后生成的Stage如下 划分Stage阶段完成后,DAGScheduler的handleJobSubmitted方法提交Stage,如下 本篇博客重点就是讲解上图中的两个方法,其中的finalStage变量以第一幅图为例。
查看submitStage方法 submitStage方法的主要作用如图中注释,其涉及到三个重要集合
waitingStages等待运行的StagerunningStages正在运行的StagefailedStages运行失败的Stage限于篇幅,关于submitStage中的其他方法不再详解。最后submitStage中的流程大致如下
以Spark DAG之划分Stage中切分的Stage为例,执行submitStage(finalStage),此时finalStage的值为ResultStage 4(参考第一幅图),submitStage方法执行完状态如下
集合包含的Stage状态runningStagesShuffleMapStage 0、ShuffleMapStage 2转为ShuffleMapTask,发送给Executor执行waitingStagesShuffleMapStage 1、ShuffleMapStage 3、ResultStage 4等待failedStages空submitStage方法执行完毕后调用submitWaitingStages方法,查看该方法 该方法非常简单,职责如下
拷贝集合waitingStages到waitingStagesCopy,清空waitingStages。遍历waitingStagesCopy中的Stage,调用submitStage方法。submitStage的流程上面刚介绍过,submitWaitingStages的流程如下
可以看出调用一次submitWaitingStages方法不能完成所有Stage的提交,需要多次的调用,就是说,提交一个Stage必须其父Stage全部运算完毕。接下来看下哪些事件会触发submitWaitingStages。
围绕submitStage和submitWaitingStages方法,通过流程图,介绍如何提交Stage,大致如下
调用submitStage提交Stage。DAGScheduler处理定义的各种事件都会调用一次submitWaitingStages方法,submitWaitingStages继续调用submitStage提交处于waiting状态的Stage,直至所有Stage执行完毕。