Spark中一个action触发一个job的执行,在job提交过程中主要涉及Driver和Executor两个节点。

Driver主要解决

1. RDD 依赖性分析,生成DAG。

2. 根据RDD DAG将job分割为多个Stage。

3. Stage一经确认,即生成相应的Task,将生成的Task分发到Executor执行。

Executor节点在接收到执行任务的指令后,启动新的线程运行任务,并将结果返回。

划分Stage

当某个操作触发计算,向DAGScheduler提交作业时,DAGScheduler需要从RDD依赖链最末端的RDD出发,遍历整个RDD依赖链,划分Stage任务阶段,并决定各个Stage之间的依赖关系。Stage的划分是以ShuffleDependency为依据的,也就是说当某个RDD的运算需要将数据进行Shuffle时,这个包含了Shuffle依赖关系的RDD将被用来作为输入信息,构建一个新的Stage,由此为依据划分Stage,可以确保有依赖关系的数据能够按照正确的顺序得到处理和运算。

以GroupByKey操作为例,该操作返回的结果实际上是一个ShuffleRDD,当DAGScheduler遍历到这个ShuffleRDD的时候,因为其Dependency是一个ShuffleDependency,于是这个ShuffleRDD的父RDD以及shuffleDependency等对象就被用来构建一个新的Stage,这个Stage的输出结果的分区方式,则由ShuffleDependency中的Partitioner对象来决定。

可以看到,尽管划分和构建Stage的依据是ShuffleDependency,对应的RDD也就是这里的ShuffleRDD,但是这个Stage所处理的数据是从这个shuffleRDD的父RDD开始计算的,只是最终的输出结果的位置信息参考了ShuffleRDD返回的ShuffleDependency里所包含的内容。而shuffleRDD本身的运算操作(其实就是一个获取shuffle结果的过程),是在下一个Stage里进行的。

提交Stage

上一个步骤得到一个或多个有依赖关系的Stage,其中直接触发Job的RDD所关联的Stage作为FinalStage生成一个Job实例,这两者的关系进一步存储在resultStageToJob映射表中,用于在该Stage全部完成时做一些后续处理,如报告状态,清理Job相关数据等。

具体提交一个Stage时,首先判断该Stage所依赖的父Stage的结果是否可用,如果所有父Stage的结果都可用,则提交该Stage,如果有任何一个父Stage的结果不可用,则迭代尝试提交父Stage。 所有迭代过程中由于所依赖Stage的结果不可用而没有提交成功的Stage都被放到waitingStages列表中等待将来被提交

什么时候waitingStages中的Stage会被重新提交呢,当一个属于中间过程Stage的任务(这种类型的任务所对应的类为ShuffleMapTask)完成以后,DAGScheduler会检查对应的Stage的所有任务是否都完成了,如果是都完成了,则DAGScheduler将重新扫描一次waitingStages中的所有Stage,检查他们是否还有任何依赖的Stage没有完成,如果没有就可以提交该Stage。

此外每当完成一次DAGScheduler的事件循环以后,也会触发一次从等待和失败列表中扫描并提交就绪Stage的调用过程

TaskSet的提交

每个Stage的提交,最终是转换成一个TaskSet任务集的提交,DAGScheduler通过TaskScheduler接口提交TaskSet,这个TaskSet最终会触发TaskScheduler构建一个TaskSetManager的实例来管理这个TaskSet的生命周期,对于DAGScheduler来说提交Stage的工作到此就完成了。而TaskScheduler的具体实现则会在得到计算资源的时候,进一步通过TaskSetManager调度具体的Task到对应的Executor节点上进行运算

最新文章

  1. [原]分享一下我和MongoDB与Redis那些事
  2. Android 笔记 AutoCompleteTextView day8
  3. python读取文本文件
  4. 跟着百度学PHP[4]OOP面对对象编程-8-继承
  5. 小项目特供 简易迷宫(基于Java)
  6. vs.net 2005 C# WinForm GroupBOX 的BUG?尝试读取或写入受保护的内存。这通常指示其他内存已损坏
  7. java多线程的使用2
  8. GS初始化
  9. PowerDesiger 15逆向生成工程E-R图及导出word表格
  10. string.length()与-1比较为什么会出现匪夷所思的结果
  11. C随便练练手的题
  12. wpf数据自动树结构
  13. Python中字符串的方法及注释
  14. Binder机制,从Java到C (1. IPC in Application Remote Service)
  15. HTML target 属性
  16. 百度语音合成AI
  17. webForm TO MVC
  18. python中list列表的方法len()
  19. CentOS6.8下安装mysql
  20. 第23章:MongoDB-聚合操作--聚合命令

热门文章

  1. Spring Boot 项目学习 (一) 项目搭建
  2. 前端开发—jQuery
  3. Disconf使用简单Demo
  4. Spring 的IOC和DI
  5. MySQL数据库唯一性设置(unique index)
  6. Arduino基本函数介绍
  7. html--onreadystatechange属性
  8. Ubuntu14.04.1安装搜狗拼音输入法
  9. NEFU 117
  10. 【Java并发编程实战】—–synchronized