Spark源码分析之一:Job提交运行总流程概述
Spark是一个基于内存的分布式计算框架,运行在其上的应用程序,按照Action被划分为一个个Job,而Job提交运行的总流程,大致分为两个阶段:
1、Stage划分与提交
(1)Job按照RDD之间的依赖关系是否为宽依赖,由DAGScheduler划分为一个个Stage,并将每个Stage提交给TaskScheduler;
(2)Stage随后被提交,并由TaskScheduler将每个stage转化为一个TaskSet;
2、Task调度与执行:由TaskScheduler负责将TaskSet中的Task调度到Worker节点的Executor上执行。
而对于第一阶段Stage划分与提交,又主要分为三个阶段:
1、Job的调度模型与运行反馈;
2、Stage划分;
3、Stage提交:对应TaskSet的生成。
下面,就以图及部分源码,概略介绍下以上三个阶段。
一、Job的调度模型与运行反馈
1、首先由DAGScheduler负责将Job提交到事件队列eventProcessLoop中,等待调度执行
该事件队列为DAGSchedulerEventProcessLoop类型,内部封装了一个BlockingQueue阻塞队列,并由一个后台线程eventThread不断的调用onReceive()方法处理其中的事件;
2、创建一个JobWaiter对象并返回给客户端
利用这个JobWaiter对象的awaitResult()方法对Job进行监控与运行反馈,并获得JobSucceeded和JobFailed两种Job运行结果;
3、DAGSchedulerEventProcessLoop的onReceive()方法处理事件
onReceive()方法继续调用doOnReceive(event)方法,然后根据传入的事件类型DAGSchedulerEvent决定调用哪个方法处理事件,这里传入的是JobSubmitted事件,调用的是DAGScheduler的handleJobSubmitted()方法,继而进入下一个阶段。
整个处理流程如下图所示:
二、Stage划分
在第一阶段将JobSubmitted事件提交到事件队列后,DAGScheduler的handleJobSubmitted()方法就开始了Stage的划分。
首先,根据finalRDD获取其Parent Stages,即ShuffleMapStage列表;
然后,利用finalRDD生成最后一个Stage,即ResultStage;
最后,生成ActiveJob对象,并维护各种stage、job等数据结构。
整个处理流程如下图所示:
三、Stage提交:对应TaskSet的生成
首先,提交finalStage;
然后,提交其parent Stage,如果对应parent Stage还存在尚未提交的parent Stage,提交之;
最好,对于没有parent Stage的Stage,根据stage中rdd的分区,生成tasks,即TaskSet,创建TaskSetManager,并由SchedulerBackend申请资源。
整个处理流程如下图所示:
未完待续,明天继续~
博客原地址:http://blog.csdn.net/lipeng_bigdata/article/details/50663569
Spark源码分析之一:Job提交运行总流程概述的更多相关文章
- Spark源码分析之八:Task运行(二)
在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
- Spark源码分析之二:Job的调度模型与运行反馈
在<Spark源码分析之Job提交运行总流程概述>一文中,我们提到了,Job提交与运行的第一阶段Stage划分与提交,可以分为三个阶段: 1.Job的调度模型与运行反馈: 2.Stage划 ...
- Spark源码分析之五:Task调度(一)
在前四篇博文中,我们分析了Job提交运行总流程的第一阶段Stage划分与提交,它又被细化为三个分阶段: 1.Job的调度模型与运行反馈: 2.Stage划分: 3.Stage提交:对应TaskSet的 ...
- Spark源码分析之九:内存管理模型
Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...
- Netty源码分析第3章(客户端接入流程)---->第1节: 初始化NioSockectChannelConfig
Netty源码分析第三章: 客户端接入流程 概述: 之前的章节学习了server启动以及eventLoop相关的逻辑, eventLoop轮询到客户端接入事件之后是如何处理的?这一章我们循序渐进, 带 ...
- Spark源码分析之四:Stage提交
各位看官,上一篇<Spark源码分析之Stage划分>详细讲述了Spark中Stage的划分,下面,我们进入第三个阶段--Stage提交. Stage提交阶段的主要目的就一个,就是将每个S ...
- spark 源码分析之十九 -- Stage的提交
引言 上篇 spark 源码分析之十九 -- DAG的生成和Stage的划分 中,主要介绍了下图中的前两个阶段DAG的构建和Stage的划分. 本篇文章主要剖析,Stage是如何提交的. rdd的依赖 ...
- Spark源码分析:多种部署方式之间的区别与联系(转)
原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...
随机推荐
- 【UVA11859】Division Game(SG函数,Nim游戏)
题意:给定一个n*m的矩阵,两个游戏者轮流操作. 每次可以选一行中的1个或多个大于1的整数,把它们中的每个数都变成它的某个真因子,不能操作的输. 问先手能否获胜 n,m<=50,2<=a[ ...
- java-判断字符串是否为数字
1.使用java自带的函数 public static boolean isNumeric1(String str){ int len=str.length(); if(len>1&&a ...
- VIM 的 modeline 和 autocmd
modeline vim的modeline可以让你针对每个文件进行文件级别的设置,这些设置是覆盖当前用户的vimrc中的设置的.当vim打开一个包含了vim modeline注释行的文件时,会自动读取 ...
- [wxPython学习]wx.CallAfter和wx.FutureCall
[wxPython学习]wx.CallAfter和wx.FutureCall 今天才学到的两个wxPython中的函数:wx.CallAfter和wx.FutureCall.这是两个无关的函数,但又多 ...
- uva 1149:Bin Packing(贪心)
题意:给定N物品的重量,背包容量M,一个背包最多放两个东西.问至少多少个背包. 思路:贪心,最大的和最小的放.如果这样都不行,那最大的一定孤独终生.否则,相伴而行. 代码: #include < ...
- hdu 5055(模拟)
Bob and math problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Python Challenge 第十三关
第13关.一张电话的图片,一句话:phone that evil.看到电话,加上之前关卡有些图片有链接,我就在电话按键上都点点试试,果然 5 是个链接,就点了进去.出来一个XML文件,第一句写着:Th ...
- Action 和 Func 的用法以及区别
Action 无返回值 Func 有返回值,且最后一个参数为返回值 Action用法 public static void test(string s) { Console.WriteLine(&qu ...
- ASP.NET MVC 实现 AJAX 跨域请求
ASP.NET MVC 实现AJAX跨域请求的两种方法 和大家分享下Ajax 跨域的经验,之前也找了好多资料,但是都不行,后来看到个可行的修改了并测试下 果然OK了 希望对大家有所帮助! 通常发送 ...
- codevs——1154 能量项链(区间DP)
2006年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在Mars星球上,每个Mars人 ...