spark的stage是如何划分的

版权声明:原创文章,转载请注明出处 https://blog.csdn.net/xianpanjia4616/article/details/84673132

最近有很多人问我,spark中的stage是怎么划分的?到底是根据什么把一个job分为多个stage的,那我们今天就用最通俗易懂的语言给大家分析一下,帮助大家的理解.

我们都知道spark的job是根据action算子触发的,遇到action算子就会起一个job,job里面又划分了很多个stage,然后每一个stage里面运行了很多个task.请大家先记住一句话,stage的划分依据就是看是否产生了shuflle(即宽依赖),遇到一个shuffle操作就划分为前后两个stage.

什么是shuffle?

那有的同学就要问了,什么是shuffle操作呢?宽依赖又是什么呢?看一下官网的定义:shuffle 是spark 重新分配数据的一种机制,使得这些数据可以跨不同的区域进行分组。这通常涉及在 executors 和 机器之间拷贝数据,这使得 shuffle 成为一个复杂的、代价高的操作。

我先来举个例子.shuffle就是混洗的意思,我们都打过扑克牌(4个人),一句打完之后要进行洗牌,然后重新开始,其实这4个人就可以看作是4个分区,每个人手里的牌,就可以看作是分区里面的数据,把大家的牌放到一块混洗这个动作,就可以理解为是shuffle操作,shuffle就是把不同分区的数据拿出来,发到同一个分区里面.

什么是窄依赖和宽依赖?

简单两句话总结一下:

窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用.例如map、filter、union等操作会产生窄依赖
宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用. 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle

我们知道RDD之间是有依赖关系的或者说是血缘关系,产生shuffle的时候表明了,子父级RDD之间是宽依赖关系,那有的同学就说了,讲了这么多我还是不理解是什么意思,别急,接下来我们看一张spark job的依赖关系图,借助图片再帮助大家理解一下:

 我们来分析一下这个依赖图,我们从后往前看,为什么要从后往前看呢?是因为RDD之间是有血缘关系的,后面的RDD依赖前面的RDD,也就是说,后面的RDD要等前面的RDD执行完,才会执行,所以从后往前遇到宽依赖就分为两个stage,shuffle前一个,shuffle后一个,如果整个过程没有产生shuffle那就只会有一个stage,所以上图中,RDD a 单独一个stage1,RDD c,d,e,f被划分在stage2中,最后RDD b和RDD g划分在了stage3 里面.

结合实例的分析可以看这个,stage的划分就先写到这里吧

如果有写的不对的地方,欢迎大家指正,如果有什么疑问,可以加QQ群:340297350,谢谢

扫描二维码关注公众号,回复: 5107511 查看本文章

猜你喜欢

转载自blog.csdn.net/xianpanjia4616/article/details/84673132
今日推荐