前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark内核分析之DAGScheduler划分算法实现原理讲解(重要)

Spark内核分析之DAGScheduler划分算法实现原理讲解(重要)

作者头像
z小赵
发布2018-09-05 15:48:02
5700
发布2018-09-05 15:48:02
举报

接着上一篇,我们接着来分析下一个非常重要的组建DAGScheduler的运行原理是怎么实现的;通过之前对Spark的分析讲解,我们的Spark作业是在遇到一个action算子以后并以此为界限,划分出一个Job出来,也就是在这个时候,Spark作业向集群提交一个Job任务;下面我们看看源码是如何实现的;

spark Job提交源码图

        通过在任何一个action操作的算子中追踪发现,最终提交一个Job是调用了SparkContext的runJob方法实现的,在该方法中通过dagSchedualer.runJob()正式向集群提交一个Job任务,接下来重点来了,我们来看看DAGScheduler是如何对一个Job进行stage划分的;

提交任务

这里通过eventProcessLoop对象将Job进行提交,下面我们看看在eventProcessLoop中具体发生了什么;

1.首先,创建出与partition数量相等的task;

2.由触发Job提交的那个RDD算子作为作为起点,创建第一个stage并命名为finalStage;

3.对于if条件成立的内容,是针对于本地模式运行的,我们主要来分析一下集群模式下的工作模式,在else逻辑中,我们可以看到调用了submitStage的方法,该方法就是实现stage划分的重要实现;

stage划分算法实现

1.在该方法中我们调用了getMissingParentStages()方法,并将其RDD压入一个栈中;

2.在这个方法中,首先弹栈获得栈顶的RDD,并使用循环反复调用当前RDD所依赖的父RDD,并判断其父RDD是宽依赖还是窄依赖;

3.如果是宽依赖,则创建一个新的stage,并将其加入到missingStage缓存中;如果是窄依赖的话,则将当前的RDD在压入栈中;

4.如此往复,直到一个stage遍历完成;

5.运行完以上动作之后,接着使用递归操作,重复调用submitStage()方法,直到没有父Stage的时候,即方法返回结果为Nil的时候,开始调用submitMissingTask将一个stage(即一个Taskset)提交给TaskScheduler去;

总结:至此,我们的DAGScheduler的stage划分算法基本上就介绍完了,下篇文章我们来接着介绍当一个Taskset被提交给TaskScheduler后,TaskScheduler是如何对一个Taskset集合中的每个Task进行合理分配的,即我们的Task分配算法是如何实现的,欢迎关注。

如需转载,请注明:

上一篇:Spark内核分析之Worker原理分析

本篇:Spark内核分析之DAGScheduler划分算法实现原理讲解(重要)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档