Spark Stage 的划分

 

Spark做业调度

对RDD的操做分为transformation和action两类,真正的做业提交运行发生在action以后,调用action以后会将对原始输入数据的全部transformation操做封装成做业并向集群提交运行。这个过程大体能够以下描述:git

    • DAGSchedulerRDD之间的依赖性进行分析,经过DAG来分析各个RDD之间的转换依赖关系
    • 根据DAGScheduler分析获得的RDD依赖关系将Job划分红多个stage
    • 每一个stage会生成一个TaskSet并提交给TaskScheduler,调度权转交给TaskScheduler,由它来负责分发task到worker执行

 

接下来,理解 Spark 中RDD的依赖关系.github

 

RDD依赖关系  

Spark中RDD的粗粒度操做,每一次transformation都会生成一个新的RDD,这样就会创建RDD之间的先后依赖关系,在Spark中,依赖关系被定义为两种类型,分别是窄依赖和宽依赖spa

 

  • 窄依赖,父RDD的分区最多只会被子RDD的一个分区使用
  • 宽依赖,父RDD的一个分区会被子RDD的多个分区使用(宽依赖指子RDD的每一个分区都要依赖于父RDD的全部分区,这是shuffle类操做)

 

rddependency

图中左边都是窄依赖关系,能够看出分区是1对1的。右边为宽依赖关系,有分区是1对多。(map,filter,union属于第一类窄依赖).net

 

 

stage的划分

 

stage的划分是Spark做业调度的关键一步,它基于DAG肯定依赖关系,借此来划分stage,将依赖链断开,每一个stage内部能够并行运行,整个做业按照stage顺序依次执行,最终完成整个Job。实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage天然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stagestage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。orm

图中能够看出,在宽依赖关系处就会断开依赖链,划分stage,这里的stage1不须要计算,只须要计算stage2和stage3,就能够完成整个Job。blog

 

 

总结:遇到一个宽依赖就分一个stage

 

 

 

 

 

 

 

 

参考博客:https://blog.csdn.net/mahuacai/article/details/51919615文档

                  https://wongxingjun.github.io/2015/05/25/Spark%E4%BD%9C%E4%B8%9A%E8%B0%83%E5%BA%A6%E4%B8%ADstage%E7%9A%84%E5%88%92%E5%88%86/get

相关文章
相关标签/搜索