job提交
rdd中的action算子,会触发job任务计算。
以collect算子举例,可以看到最后是调用的DAGScheduler的submitJob方法
DAGScheduler的runJob调用的是submitJob方法。
submitJob是先生成新的jobId,发送JobSubmitted的消息。
DAGScheduler收到JobSubmitted消息后,调用handleJobSubmitted方法。
handleJobSubmitted调用createResultStage方法。createResultStage中会创建job对应的一系列stage并提交。
stage创建
stage有两种,一个是ShuffleMapStage,一个是ResultStage。
ResultStage 是最后的产生结果的stage
ShuffleMapStage 是执行 DAG 中的中间阶段,用于生成用于shuffle的数据。
创建ResultStage
创建ResultStage先向上创建父级stage,然后生成stageId,用stageId和parents创建resultStage。
创建父级stage
getOrCreateParentStages方法是先getShuffleDependencies获取父级shuffle依赖,再遍历父级shuffle依赖创建ShuffleMapStage。
获取父级shuffle依赖
getShuffleDependencies的方法中遍历了rdd的依赖。如果rdd的依赖是ShuffleDependency加入到parents,不是ShuffleDependency加入等待遍历的集合waitingForVisit。
这个方法只能返回直接父级,比如A <-- B <-- C,C只会返回B不会返回A和B。
创建ShuffleMapStage
优先从shuffleIdToMapStage中获取ShuffleMapStage,没有的话就创建。
创建的时候调用getMissingAncestorShuffleDependencies获取rdd上游缺少的所有shuffle依赖,并创建。
创建ShuffleMapStage调用createShuffleMapStage方法。
获取祖先shuffle依赖
向上遍历所有的shuffle依赖。每层都是调用getShuffleDependencies方法
创建ShuffleMapStage对象
getOrCreateParentStages获取parents(父级stage),nextStageId获取id(新的stageId)。
用id和parents创建ShuffleMapStage对象。
将新创建的stage信息缓存起来,主要是shuffleIdToMapStage(shuffleId->stage),在mapOutputTracker中注册shuffle。
创建ResultStage对象
上面已经完成父级stage创建和新的stageId,使用parents和id创建ResultStage对象。
至此stage划分完成。
附一个方法调用的时序图