1.DAG调度器. 是一个有向无环图!可以理解成是一个树的结构
高级调度,面向阶段(stage-0,stage-1)调度。
为每个job计算stage的DAG,跟踪哪个rdd和stage输出需要 // keeps track of which RDDs andstage outputs are materialized,
寻找最小调度进行运行。
以taskSet方式提交stage给底层任务调度器(实现了在集群上运行)。
taskset包含了独立的task,可以基于集群上的数据运行,如果数据不可用,或许导致失败。
在shuffle的边界过程将RDD打碎创建stage,窄依赖的RDD操作,比如map()和filter()
在每个stage(阶段)中连同task set被放入管道中。
shuffle依赖的操作需要多个阶段,对于每个stage,在末端,都只有一个shuffle依赖相应与另一个stage。
实际的操作管道是在各种RDD的compute方法中执行的。
DAG调度器决定了运行任务的首选位置,依赖于缓存状态和传递给Task调度器实现方法。
处理因为shuffle数据丢失导致failure故障,重复提交old stage的。
不是因为suffle 丢失数据导致failure,由TaskScheduler进行处理。在进行取消整个stage执行
若干次retry。
[job]
提交给调度器的顶层工作项。
ActiveJob 在DAG运行job。有两种类型,Resultjob 和 map-stage job。
resultjob计算ResultStage来执行action。
map-stagejob在以一个stage提交前,计算ShuffleMapStage的output,并可以用作
查询计划以及提交给下一阶段前查看map输出的统计内容。可以使用finalStage字段进行两种
job类型的区分。
[Stages]
在job中计算中间的结果的task集合。每个task在同一RDD的每个分区上计算同一函数。stage是通过shuffle
边界进行隔离。引入了一个障碍(必须等到前一阶段完成后才能提取output).
有两种Stage,ResultStage和ShuffleMapStage.
ResultStage是执行action的final的stage.
ShuffleMapStage是为shuffle过程将map的output进行write的。
如果rdd被多个job重用,相应的stage可以跨job进行共享。
[task]
单独的工作单元,发送一台主机。
[cache tracking]
DAG调度器分析被缓存的RDD,以避免重复计算,也会记住在map阶段已经产生了output的shuffle,避免重复map过程。
[prefered location]
DAG调度器基于底层RDD、缓存的配置或者shuffle的数据参数得到首选位置,并计算task运行地点。
[Cleanup]
job完成后数据结构被清除了,防止内存泄漏。
为了故障恢复,同一stage或许要运行多次,称之为attemp.
如果task调度器报告一个错误说是因为上一个stage的map output丢失了,DAG调度器就会提交丢失的stage.
这是通过Compeletion with FetchFailed或者ExecutorLostevent对象检测的。
DAG调度器等待一段时间看是否其他节点或者task出现故障,然后重新提交lost stage的task集合。
taskSet //task的集合
stage //task的集合
[Job]
由一个或都Stage构成。
[TaskScheduler]
任务调度器。
底层任务调度器接口,有专门实现TaskSchedulerImpl.
每个调度器调度任务需要一个单独的SparkContext对象。
该调度器会从DAG调度器中得到提交的task集合,并负责发送
task给cluster,运行他们,出错重试,返回事件对象给DAG调度器。
[TaskSchedulerImpl]
处理常规逻辑,有一个可插拔的SchedulerBackend.
[SchedulerBackend]
[LocalSchedulerBackend]
本地模式下使用的后台调度器,处理任务启动等工作。
[StandaloneSchedulerBackend]
继承了CoarseGrainedSchedulerBackend.
针对spark独立模式下的后台调度器实现。
[CoarseGrainedSchedulerBackend]
粗粒度后台调度.
[Stage]
是并行运行task集合,这些task都运行同一函数,并有同一shuffle依赖。调度器将
task的DAG进行切割成stage,该工作是在shuffle出现的边界进行处理。
DAG调度器以拓扑顺序执行stage。
每个stage可以是ShuffleMapStage,他的计算结果是其他stage的输入,也可以是ResultStage,
ResultStage他的task是通过在RDD上执行一个函数来直接计算Spark的action。
每个Stage都有FirstJobid,标识第一个提交的job。
使用FIFO调度策略时,允许早期的job先行计算或者故障快速恢复。
[Task]
有两种实现,ResultTask + ShuffleMapTask.
job的最后一个stage由多个ResultTask构成,而先前的stage由ShuffleMapTasks组成。
ResultTask执行task并发送结果给驱动程序。
ShuffleMapTask执行task,并task output分成多个bucket(基于task的partitioner)
[Dependency]抽象类
|
------<|---NarrowDependency
|---<|---RangeDependency
|---<|---OneToOneDependency
|---<|---PruneDependency //修剪
------<|---ShuffleDependency
[Executor]
后台通过线程池执行task.