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

DAG

在spark里每一个操作生成一个RDD,RDD之间连一条边,最后这些RDD和他们之间的边组成一个有向无环图,这个就是DAG。

Spark内核会在需要计算发生的时刻绘制一张关于计算路径的有向无环图,也就是DAG。有了计算的DAG图,Spark内核下一步的任务就是根据DAG图将计算划分成任务集,也就是Stage,这样可以将任务提交到计算(节点进行真正的计算)。Spark计算的中间结果默认是保存在内存中的,Spark在划分Stage的时候会充分考虑在分布式计算中流水线计算(pipeline)的部分来提高计算的效率,而在这个过程中,主要的根据就是RDD的依赖类型。根据不同的transformation操作,RDD的依赖可以分为窄依赖(Narrow Dependency)和宽依赖(Wide Dependency,在代码中为ShuffleDependency)两种类型。窄依赖指的是生成的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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值