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的提交工作完结。