Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

作业提交阶段

  1. 进入到collect()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到runJob()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 继续进入runJob()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到runJob()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到runJob()中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到dagScheduler.runJob()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到submitJob()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到post方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到eventQueue的实现类(ctrl + h)

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

Stage划分阶段

  1. 找到onReceive类中的doOnReceive(event)方法,并进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进入到dagScheduler.handleJobSubmitted()方法中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到createResultStage()并进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 查看创建父宽依赖的方法getOrCreateParentStages()进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到getShuffleDependencies()这个寻找父依赖方法,进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 次方法只返回了一层依赖,那么如果出现多级依赖,剩下的依赖将在第五步中getOrCreateShuffleMapStage(shuffleDep, firstJobId)中取出,点击getOrCreateShuffleMapStage()方法进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到getMissingAncestorShuffleDependencies()方法,并进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 方法会将后面又得宽依赖添加到ancestors这个栈中,然后进行返回,由第七步得foreach方法中,为每一个宽依赖创建一个 new ShuffleMapStage得stage

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. createShuffleMapStage()方法中,会将栈中元素都创建一个stage

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

Task提交阶段

  1. 将Stage创建完后,在Stage划分阶段第三步结束后,进行提交Stage,进入到submitStage()方法

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到submitMissingTasks()方法进入其中,进行Task分配

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 进行模式匹配,看是resultStage,还是我们找得ShuffleMapStage,加入是ShuffleMapStage,我们将对其进行分区计算,找到到partitionsToCompute属性

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. partitionsToCompute属性调用了findMissingPartitions()方法,进入其中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. ctrl + h找到实现类,假设是ShuffleMapStage,进入类中

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 找到findMissingPartitions()方法,通过numPartitions获取分区数,返回到一个集合中(Task和分区数有关)

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

  1. 为每一个分区数创建一个task,最后进行task提交

Spark中Stage任务划分源码跟踪并简单解析|任务提交阶段|Stage划分阶段|Task提交阶段

整个Stage任务划分结束