Spark — stage划分算法

DAGScheduler的stage分配算法原理分析

为了直观的描述DAGScheduler的划分算法,我们使用上一篇分析Job触发原理的wordcount程序示例来进行分析,具体代码请看上一篇博客:Spark源码分析之 — Job触发流程原理与源码分析

如下图所示,清晰的演示了stage是如何划分的:

 

如上所示,DAGScheduler的stage划分算法,会从触发action操作的那个RDD开始倒推,首先会为最后一个RDD创建一个Stage(finalStage),然后往前倒推的时候,如果发现某个RDD是宽依赖,那么就将宽依赖的那个RDD,创建一个Stage,如上图所示,以shuffledRDD为界,创建了一个Stage1,这个shuffledRDD,就是这个Stage1中的最后一个RDD,然后以此类推,以宽依赖为标志,创建stage,直到RDD遍历完为止。

综上所述,Stage的划分是以宽依赖为标志,进行Stage的划分。

下面是wordcount程序实际运行中stage的划分情况(4040端口查看):

 

其中wordcount触发Job的action操作是foreach(),这里可以看出以reduceByKey(代码中的第19行)为界,将整个Job划分为了两个stage,0和1,其中stage的ID是从0开始的。详细的stage划分如下图所示:

     

 

 

可以很清楚的看到,stage0里做了哪些操作,可以看出直到map操作都属于stage0,而当进行到reduceByKey操作的时候,就进入到了stage1中,这里就很直观的展示了wordcount程序的stage划分情况。

附上scala的wordcount的程序:

def main(args : Array[String]): Unit ={
    val conf = new SparkConf()
      .setMaster("local")
      .setAppName("wordcount")
 
    val sc = new SparkContext(conf)
 
    val lines = sc.textFile("spark.txt")
 
    val words = lines.flatMap( line => line.split(" ") )
 
    val pairs = words.map( word => (word, 1) )
 
    val counts = pairs.reduceByKey(_ + _)
 
    counts.foreach( count => println(count._1 + " : " + count._2) )
 
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值