欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我和spark有个约会(1)-Spark中的stage的划分原理

程序员文章站 2022-04-26 08:06:11
...

我和spark有个约会(1)了解DAGScheduler 阶段对stage的划分原理

spark宽窄依赖

我和spark有个约会(1)-Spark中的stage的划分原理

  • 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的创建过程

我和spark有个约会(1)-Spark中的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过程