转载请注明出处:http://www.cnblogs.com/BYRans/
spa
本文主要介绍在单个任务内Spark的调度管理,Spark调度相关概念以下:3d
各概念间的逻辑关系以下图所示:对象
Spark的调度管理模块中,最重要的类是DAGScheduler和TaskScheduler,TaskScheduler负责每一个具体任务的实际物理调度,DAGScheduler负责将做业拆分红不一样阶段的具备依赖关系的多批任务,能够理解为DAGScheduler负责任务的逻辑调度。Spark调度管理示意图以下:
blog
一个Spark任务提交后,DAGScheduler从RDD依赖链末端的RDD出发,遍历整个RDD依赖链,将Job分解成具备先后依赖关系的多个stage。DAGScheduler是根据ShuffleDependency划分stage的,也就是说当某个RDD的运算须要将数据进行shuffle操做时,这个包含了shuffle依赖关系的RDD将被用来做为输入信息,构建一个新的调度阶段。以此为依据划分调度阶段,能够确保有依赖关系的数据可以按照正确的顺序获得处理和运算。队列
在划分Stage的步骤中会获得一个或多个有依赖关系的Stage,其中直接触发做业的RDD关联的调度阶段被称为FinalStage,DAGScheduler从FinalStage开始生成一个Job。Job和Stage的关系存储在一个映射表中,用于在该调度阶段所有完成时作一些后续处理,如报告状态、清理做业相关数据等。get
具体提交一个Stage时,首先判断其依赖的全部父Stage的结果是否可用。若是全部父Stage的结果均可用,则提交该Stage。若是有任何一个父Stage的结果不可用,则尝试迭代提交当前不可用的父Stage。在迭代过程当中,父Stage还未运行的Stage都被放到等待队列中,等待未来被提交。it
下图是一个具备四个调度阶段的Job的Stage提交顺序:spark
当一个属于中间过程调度阶段的任务(这种类型的任务所对应的类为ShuffleMapTask)完成后,DAGScheduler会检查对应调度阶段的全部任务是否都完成了。若是完成了,则DAGScheduler将从新扫描一次等待列表中全部的Stage,检查它们是否还有依赖的Stage没有完成。若是全部依赖的Stage都已执行完毕,则提交该Stage。io
在这里,博主有一个疑问:可否按照DAG划分的Stage的拓扑顺序提交执行Stage?求你们指点迷津。class
根据任务结果的大小不一样,ResultTask返回的结果分为两中形式: