spark调度体系——stage划分

job提交

rdd中的action算子,会触发job任务计算。
以collect算子举例,可以看到最后是调用的DAGScheduler的submitJob方法
image.png
image.png
image.png
image.png
image.png
image.png
image.png
DAGScheduler的runJob调用的是submitJob方法。
submitJob是先生成新的jobId,发送JobSubmitted的消息。
image.png
image.png
DAGScheduler收到JobSubmitted消息后,调用handleJobSubmitted方法。
image.png
handleJobSubmitted调用createResultStage方法。createResultStage中会创建job对应的一系列stage并提交。
image.png

stage创建

stage有两种,一个是ShuffleMapStage,一个是ResultStage。
ResultStage 是最后的产生结果的stage
ShuffleMapStage 是执行 DAG 中的中间阶段,用于生成用于shuffle的数据。
image.png

创建ResultStage

创建ResultStage先向上创建父级stage,然后生成stageId,用stageId和parents创建resultStage。
image.png

创建父级stage

getOrCreateParentStages方法是先getShuffleDependencies获取父级shuffle依赖,再遍历父级shuffle依赖创建ShuffleMapStage。
image.png

获取父级shuffle依赖

getShuffleDependencies的方法中遍历了rdd的依赖。如果rdd的依赖是ShuffleDependency加入到parents,不是ShuffleDependency加入等待遍历的集合waitingForVisit。
这个方法只能返回直接父级,比如A <-- B <-- C,C只会返回B不会返回A和B。
image.png

创建ShuffleMapStage

优先从shuffleIdToMapStage中获取ShuffleMapStage,没有的话就创建。
创建的时候调用getMissingAncestorShuffleDependencies获取rdd上游缺少的所有shuffle依赖,并创建。
创建ShuffleMapStage调用createShuffleMapStage方法。
image.png

获取祖先shuffle依赖

向上遍历所有的shuffle依赖。每层都是调用getShuffleDependencies方法
image.png

创建ShuffleMapStage对象

getOrCreateParentStages获取parents(父级stage),nextStageId获取id(新的stageId)。
用id和parents创建ShuffleMapStage对象。
将新创建的stage信息缓存起来,主要是shuffleIdToMapStage(shuffleId->stage),在mapOutputTracker中注册shuffle。
image.png

创建ResultStage对象

上面已经完成父级stage创建和新的stageId,使用parents和id创建ResultStage对象。
image.png
至此stage划分完成。
附一个方法调用的时序图
stage划分.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值