Spark军师之DAGScheduler
搬个凳子,捧着瓜子,让我们开始唠嗑。
首先,字面解读下“DAGScheduler”,可以理解为是一个DAG调度器,DAG又是啥呢?学术名叫:有向无环图。一个spark应用程序提交,spark引擎就是通过DAGScheduler将其切分成一个个stage。让我们先来看看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 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全部遍历完了为之。
接下来,我们来详细看下源码:
首先创建一个finalStage:
然后进入到newResultStage这个方法里:
接下来这个重点方法来了:
到这里,就完成了一个对stage的划分。
为啥说DAGScheduler是军师呢?因为它实现了面向stage的调度层,它会为每一个Job计算出一个DAG(有向无环图),追踪RDD和stage的整个流程,同时也会寻找一个最少消耗调度机制来运job。有些在打仗之前就做好谋略的味道。
好了,这次的DAGScheduler就介绍到这里。
欢迎关注个人微信公众号:BigData共享
文章来自: