Spark军师之DAGScheduler

       搬个凳子,捧着瓜子,让我们开始唠嗑。

      首先,字面解读下“DAGScheduler”,可以理解为是一个DAG调度器,DAG又是啥呢?学术名叫:有向无环图。一个spark应用程序提交,spark引擎就是通过DAGScheduler将其切分成一个个stage。让我们先来看看DAGScheduler是在哪里起的作用的。经典图:


Spark军师之DAGScheduler


    那这个DAGScheduler的职能到底是什么呢?总结成两点:


    1.维护waiting jobs和active jobs,维护waiting stages、active stages和failed  stages,以及与jobs的映射关系;

    2.面向stage的切分。


      这时候你可能表示不服,说你说这样就是这样啊。这时候我就要开始讲事实,摆证据了,一言不合就晒证据(这点得向之前微博上炒的火热的曹云金学习)。


1.维护waiting jobs和active jobs,维护waiting stages、active stages和failed stages,以及与jobs的映射关系;


让我们稍微看下DAGScheduler的源码:


Spark军师之DAGScheduler

   

      之前我们介绍过了,一个spark application提交后,是根据action这种算子切分成job。然后一个job遇到宽依赖的算子,也就是会触发shuffle的算子,像reduceByKey, groupByKey这些算子,被切分成一个个的stage,那这些job和stage,正在运行,正在等待的stage,以及两者的映射,就是由DAGScheduler来维护的。


  2.面向stage的切分,DAGScheduler切分算法


      接下来重点来了,DAGScheduler是怎么切分stage的?

      举个简单例子,一个wordCount会被切分成两个stage,如图所示,切分依据是宽依赖。DAGScheduler会从触发action操作的那个rdd开始往前倒推,首先会为最后一个rdd创建一个stage,然后往前倒推的时候,如果发现对某个rdd是宽依赖,那么会将宽依赖的那个rdd创建一个新的stage,那个rdd就是新的stage的最后一个rdd。然后依次类推,继续往前倒推,根据宽依赖,进行stage的划分,直到所有的rdd全部遍历完了为之。


Spark军师之DAGScheduler


    接下来,我们来详细看下源码:

    首先创建一个finalStage:


Spark军师之DAGScheduler


然后进入到newResultStage这个方法里:


Spark军师之DAGScheduler


Spark军师之DAGScheduler


接下来这个重点方法来了:


Spark军师之DAGScheduler

     

       到这里,就完成了一个对stage的划分。

为啥说DAGScheduler是军师呢?因为它实现了面向stage的调度层,它会为每一个Job计算出一个DAG(有向无环图),追踪RDD和stage的整个流程,同时也会寻找一个最少消耗调度机制来运job。有些在打仗之前就做好谋略的味道。

      

       好了,这次的DAGScheduler就介绍到这里。



欢迎关注个人微信公众号:BigData共享

文章来自:

https://mp.weixin.qq.com/s?__biz=MzU2NzA3OTEwMg==&mid=2247483708&idx=1&sn=e271f3c48af3f2f0499a4a70c5392ed9&chksm=fca3f8edcbd471fb79afede5cf4e29859f8db276f81f08babc6756138b01efc365d3d27c192f#rd