共计 2178 个字符,预计需要花费 6 分钟才能阅读完成。
stage 切分后,就会创立一个 Job,所以在一个 Application 中,如果有多个 action 算子,那就有多少个 Job,每个 Job 依据 shuffle 依赖,切分成多个 stage。最初生成的这个 job 会把援用给 finalStage,也就是上篇的 stage4 里。Job 生成后,就开始提交 stage,咱们以 stage 切分的流程往下讲。次要是先找到未提交的 stage,而后依据 stage 的分区数生成对应的 task 个数,封装到 TaskSet 进行提交。
这个流程和切分有点相似,都是从左边往左边寻找。
stage4
首先拿到的是最左边的 stage4,会把 stage4.rddz(这里就是 RDD11) 压入 waitingForVisit 栈中,这个 waitingForVisit 栈就是寄存窄依赖的,而后通过窄依赖的依赖去查找 shuffle 依赖。此外还有两个数据结构,missing 汇合,用来寄存未提交的 stage,visited 汇合,用来寄存曾经遍历过的 RDD。
此时 waitingForVisit 栈中曾经有 RDD,就会把 RDD[11] 拿进去,RDD[11] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[11] 的依赖 RDD[10] 是窄依赖,所以 RDD[10] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[10] 拿进去,RDD[10] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[10] 的依赖 RDD[9] 是窄依赖,所以 RDD[9] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[9] 拿进去,RDD[9] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[9] 的依赖 RDD[4]、RDD[8] 是 shuffle 依赖,所以 stage3、state0 会放入 missing 汇合。
waitingForVisit 栈曾经为空了,missing 汇合不为空,所以持续从 stage3、state0 持续下面 stage4 的操作。
stage0
stage0 的 rdd,即 RDD8 压入 waitingForVisit 栈中。
此时 waitingForVisit 栈中曾经有 RDD,就会把 RDD[8] 拿进去,RDD[8] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[8] 的依赖 RDD[6]、RDD[7] 是窄依赖,所以 RDD[6]、RDD[7] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[7] 拿进去,RDD[7] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[7] 没有任何依赖,于是不做解决。
waitingForVisit 栈发现还有 RDD,就会把 RDD[6] 拿进去,RDD[6] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[6] 的依赖 RDD[5] 是窄依赖,所以 RDD[5] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[5] 拿进去,RDD[5] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[5] 没有任何依赖,于是不做解决。
waitingForVisit 栈曾经为空了,这次 RDD[8] 并没有任何 shuffle 依赖,于是开始创立 TaskSet。
stage0 的分区数是 4,所以会把数据存入 4 个 Task,stage0 是 ShuffleMapStage,所以这个 Task 就是 ShuffleMapTask,最初把 Task 汇合封装在 TaskSet 中,交给 TaskSchedulerImpl 解决。
stage3
stage0 解决完后,就开始解决 stage3,把 RDD4 压入 waitingForVisit 栈中。
此时 waitingForVisit 栈中曾经有 RDD,就会把 RDD[4] 拿进去,RDD[4] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[8] 的依赖 RDD[3] 是窄依赖,所以 RDD[3] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[3] 拿进去,RDD[3] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[3] 的依赖 RDD[2] 是窄依赖,所以 RDD[2] 就会压入 waitingForVisit 栈中。
waitingForVisit 栈发现还有 RDD,就会把 RDD[2] 拿进去,RDD[2] 是没有遍历过的,所以会放入 visited 汇合,另外 RDD[2] 的依赖 RDD[1]、RDD[0] 是 shuffle 依赖,所以 stage1、state2 会放入 missing 汇合。
waitingForVisit 栈曾经为空了,并且 stage1、state2 并没有任何 shuffle 依赖,于是开始创立 TaskSet。
stage1、state2 的分区数是 2,所以会把数据存入 2 个 Task,stage1、state2 是 ShuffleMapStage,所以这两个 stage 的 Task 都是 ShuffleMapTask,最初把 Task 汇合封装在 TaskSet 中,交给 TaskSchedulerImpl 解决。
此时最右边的三个 stage 都曾经封装好 TaskSet,TaskSet 的提交工作完结。