关于spark:Spark-stage切分

本文以宽依赖和窄依赖的例子来解说stage切分的过程,这里跟之前不一样的是,join操作是宽依赖
为了看的更不便一些,咱们把上一篇的最终的图片简化一下,能够看到多了4个灰色的RDD,这是因为有些转换,比方join,外面还有做一些其余的转换操作。

数据的流程是右边到左边的,stage的切分流程是相同的,是从左边到右边。次要的操作是从左边往左边走,碰到shuffle依赖后,就会把他当做本人的stage的父节点。stage的父节点也会往左边,看看有没有shuffle依赖,反复着下面的过程,直至所有RDD都走完。这样说有些形象,上面用图形一步步解说stage切分的全过程。

RDD[11]

首先拿到的是最左边的RDD[11],会把RDD[11]压入waitingForVisit栈中,这个waitingForVisit栈就是寄存窄依赖的,而后通过窄依赖的依赖去查找shuffle依赖。此外还有两个数据结构,parents汇合,用来寄存shuffle依赖,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依赖,所以RDD[4]、RDD[8]会放入parents汇合。

waitingForVisit栈曾经为空了,所以就能够开始创立stage。这个stage是左边的,所以还要看看他是否有父节点,也就是是否还有shuffle依赖,这个查找的过程,跟下面一样。

RDD[8]

RDD[11]中的shuffle依赖RDD[8]压入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依赖,于是间接创立id为0的stage0。

RDD[4]

RDD[11]中的shuffle依赖RDD[8]曾经解决了,而后shuffle依赖RDD[4]压入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依赖,所以RDD[1]、RDD[0]会放入parents汇合。

waitingForVisit栈曾经为空了,所以又开始创立stage了。
因为RDD[1]、RDD[0]没有父节点,于是就间接id为1、2的stage1和stage2。

而后咱们回到RDD[4],为RDD[4]创立stage,因为他shuffle依赖为stage1和stage2,所以RDD[4]创立了一个id为3,父节点为stage1和stage2的stage3。

RDD[11]

咱们再回到RDD[11],此时他的shuffle依赖RDD[4]和RDD[8]都曾经创立好了stage,所以RDD[11]创立了一个id为4,父节点为stage3和stage0的stage4。至此,stage创立实现。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理