我和spark有个约会(1)-Spark中的stage的划分原理
我和spark有个约会(1)了解DAGScheduler 阶段对stage的划分原理
spark宽窄依赖
narrow dependencies:child rdd只依赖于parentrdd[s]的部分固定的partition
wide dependencies:child rdd 每个partition 都依赖于parent rdd[s] 的全部partition(也称之为shuffle dependencies 会触发shuffle)
从图上可以看出宽依赖和窄依赖和你使用rdd的算子有很强的关系,所以在使用的时候 辨别不同算子会产生宽依赖还是窄依赖很重要。
一个dag scheduler 根据宽窄依赖将一个spark job划分为不同的stage。而宽依赖就是划分的标准,遇到一个宽依赖就会从中一切为二,如上图一样划分为两个stage。
stage 分为两种,resultstage和shufflemapstage两种,sparkjob 最后产生的stage为resultstage,中间阶段产生的stage为shufflemapstage。
task 分类:在resultstage阶段的都是resulttask,在shufflemapstage称为ShuffleMapTask。
一个完整的stage的创建过程
对 G 调用 creatResultStage,先创建parent rdd ,stage1和stage2 然后在创建stage3。具体分析如下:
api:调用关系图
creatResultStage getMissingParentStages
| |
| |
v |
getOrCreateParentStages <-------------|--------|
| 获取所有的shuffle依赖 | |
v | |
getOrCreateShuffleMapStage<-----------| |
| 当前以及所有存在的上游stage都要创建 |
| |
v |
createShuffleMapStage--------------------------|尝试创建上游stage,然后创建自己
对G调用creatResultStage通过getOrCreateParentStages获取所有的parentsList[stage],作为所有直接父亲stage,创建本身的 ResultStage。 getOrCreateParentStages会先创建上游 stage1 stage2,然后创建自己的 stage3
getOrCreateParentStages会调用getShuffleDependencies获得rdd_G所有直接宽依赖 HashSet(S_F,S_A),然后遍历集合对S_F和S_A调用getOrCreateShuffleMapStage
对S_A调用 getOrCreateShuffleMapStage, shuffleIdToMapStage 中获取判断为None, 对 rdd_A 调用getMissingAncestorShuffleDependencies返回为空,对 S_A 调用 createShuffleMapStage,由于rdd_A 没有parent stage直接就创建stage1返回。
s_f重复同样的操作。
把 List(stage1,stage2) 作为 stage3 的 parents stages 创建 stage3
stage | parent | |
---|---|---|
s_a | stage1 | list() |
s_f | stage2 | list() |
s_g | stage3 | list(stage1,stage2) |
next 我和spark有个约会(1)-Spark的shuflle过程
上一篇: python 爬虫1