Spark中的核心概念和任务调度

DAG
在spark里每一个操作生成一个RDD,RDD之间连一条边,最后这些RDD和他们之间的边组成一个有向无环图,这个就是DAG。
Spark内核会在需要计算发生的时刻绘制一张关于计算路径的有向无环图,也就是DAG。有了计算的DAG图,Spark内核下一步的任务就是根据DAG图将计算划分成任务集,也就是Stage,这样可以将任务提交到计算(节点进行真正的计算)。 Spark计算的中间结果默认是保存在内存中的,Spark在划分Stage的时候会充分考虑在分布式计算中流水线计算(pipeline)的部分来提高计算的效率,而在这个过程中,主要的根据就是RDD的依赖类型。根据不同的transformation操作,RDD的依赖可以分为窄依赖(Narrow Dependency)和宽依赖(Wide Dependency,在代码中为ShuffleDependenc y)两种类型。窄依赖指的是生成的RDD中每个partition只依赖于父RDD(s) 固定的partition。宽依赖指的是生成的RDD的每一个partition都依赖于父 RDD(s) 所有partition。窄依赖典型的操作有map, filter, union等,宽依赖典型的操作有groupByKey, sortByKey等。可以看到,宽依赖往往意味着shuffle操作,这也是Spark划分stage的主要边界。对于窄依赖,Spark会将其尽量划分在同一个stage中,因为它们可以进行流水线计算。

DAGScheduler
DAG调度器.
高级调度,面向阶段(stage-0,stage-1)调度。为每个job计算stage的DAG,跟踪哪个rdd和stage输出需要。以taskSet(任务组)方式提交stage给底层任务调度器(TaskScheduler实现了在集群上运行)。taskset包含了独立的task,可以基于集群上的数据运行,如果数据不可用,或许导致失败。在shuffle的边界过程将RDD(图)打碎创建stage,窄依赖的RDD操作,比如map()和filter()在每个stage中连同taskset被放入管道中。shuffle依赖的操作需要多个阶段,对于每个stage,在末端,都只有一个shuffle依赖相应与另一个stage。
实际的操作管道是在各种RDD的compute方法中执行的。
DAG调度器决定了运行任务的首选位置,依赖于缓存状态和传递给Task调度器实现方法。处理因为shuffle数据丢失导致failure故障,重复提交old stage的(是由TaskScheduler)。不是因为suffle 丢失数据导致failure,由TaskScheduler进行处理。在进行取消整个stage执行若干次retry。

核心概念
[job]
总结:提交给调度器的顶层工作项。
ActiveJob,在DAG运行job。有两种类型,Result job 和 map-stage job。result job计算ResultStage来执行action。 map-stage job在以一个stage提交前,计算ShuffleMapStage的output,并可以用作查询计划以及提交给下一阶段前查看map输出的统计内容。可以使用finalStage字段进行两种job类型的区分。

[Stages]
在job中计算中间的结果的task集合。每个task在同一RDD(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或者ExecutorLost event对象检测的。DAG调度器等待一段时间看是否其他节点或者task出现故障,然后重新提交lost stage的task集合。

[Job]作业
由一个或都Stage构成。
taskSet //task的集合
stage //taskSet的集合

[TaskScheduler]
任务调度器。
底层任务调度器接口,有专门实现TaskSchedulerImpl.每个调度器调度任务需要一个单独的SparkContext对象。该调度器会从DAG调度器中得到提交的task集合,并负责发送task给cluster,运行他们,出错重试,返回事件对象给DAG调度器。

[TaskSchedulerImpl]
处理常规逻辑,有一个可插拔的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)

猜你喜欢

转载自blog.csdn.net/lp284558195/article/details/80312258