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

        接着上一篇,我们接着来分析下一个非常重要的组建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划分算法实现原理讲解(重要)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据和云计算技术

SparkStreaming入门

黄文辉同学第二篇,请大家支持! 1.SparkStreaming简介 Spark Streaming属于核心Spark API的扩展,支持实时数据流的可扩展、高...

3594
来自专栏个人分享

Spark作业调度

    Spark在任务提交时,主要存在于Driver和Executor的两个节点.

1881
来自专栏祝威廉

Spark Streaming 误用.transform(func)函数导致的问题解析

特定情况你会发现UI 的Storage标签上有很多新的Cache RDD,然后你以为是Cache RDD 不被释放,但是通过Spark Streaming 数据...

903
来自专栏行者悟空

Spark DAG调度

1503
来自专栏Albert陈凯

2018-11-07 Spark应用程序开发参数调优深入剖析-Spark商业调优实战

本套系列博客从真实商业环境抽取案例进行总结和分享,并给出Spark商业应用实战指导,请持续关注本套博客。版权声明:本套Spark商业应用实战归作者(秦凯新)所有...

1124
来自专栏芋道源码1024

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业执行

Lite调度作业( LiteJob ),作业被调度后,调用 #execute() 执行作业。

6112
来自专栏Jed的技术阶梯

Spark性能调优02-代码调优

代码调优,就是要让大家了解以下一些Spark基本开发原则,包括:RDD lineage设计、算子的合理使用、特殊操作的优化等。在开发过程中,时时刻刻都应该注意以...

1762
来自专栏Java 源码分析

SparkStreaming 入门

2418
来自专栏Hadoop实操

Spark2Streaming读Kerberos环境的Kafka并写数据到HDFS

在前面的文章Fayson介绍了一些关于Spark2Streaming的示例如《Spark2Streaming读Kerberos环境的Kafka并写数据到HBas...

2741
来自专栏Albert陈凯

3.4 RDD的计算

3.4 RDD的计算 3.4.1 Ta s k简介 原始的RDD经过一系列转换后,会在最后一个RDD上触发一个动作,这个动作会生成一个Job。在Job被划分为...

36810

扫码关注云+社区

领取腾讯云代金券