DAGScheduler原理剖析和一些核心概念

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。

 

2.核心概念

 

       [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.


你可能感兴趣的:(Spark)