您的位置:首页 > 编程语言

Spark源代码分析之中的一个:Job提交执行总流程概述

2017-06-29 17:26 295 查看
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对象并返回给client

利用这个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申请资源。

整个处理流程例如以下图所看到的:



未完待续,明天继续~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: