Spark — stage划分算法原理分析,加上图形展示,详细的说明了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) )

  }

下一篇文章对Stage划分算法的源码进行分析,从源码层面看是否和上述一致。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值