浅谈Spark原理(四)stage的划分及shuffle原理​

网友投稿 226 2022-11-30

浅谈Spark原理(四)stage的划分及shuffle原理​

在引论中提到,有些数据处理逻辑,不能简单将数据分成多个子集后,分别处理完毕就可以得到最终想要的结果,还需要再做处理。Spark的RDD支持这样的操作,例如reduceByKey,groupbykey等等。这里就以reduceByKey为例来说明Spark stage的划分及Shuffle的原理。

在PairRDDFunctionsSuite里添加测试用例,代码如下所示:

199行先对pairsRdd做filter操作,204行再做reduceByKey操作以将相同key的值进行累加。

在运行该测试用例之前,我们先直观的探讨一下,假设8个原始记录按如下形式分布在不同的4个分区里,对这4个分区分别进行filter及reduceBykey的过程如下:

显然,对这4个分区分别进行filter及reduceByKey之后的结果不是期望的最终结果,还需要将各分区中相同key的数据再做一次分组求和才能得到期望的结果,例如需要将P1分区中的(1,2)和P2分区中的(1,4)做一次聚合相加得到(1,6)才是期望的结果。再假如也希望这个步骤能并发执行,以充分利用集群的计算资源,那怎么办呢?答案是:重新分区,将P1,P2,P3,P4这四个分区的记录重新分区,将相同key的数据划分到同一个分区。假如将这四个分区的记录重新划分为两个分区,那么可以将key为1和3的记录划分到一个分区,key为2的记录划分到另一个分区,重新分区后再按key聚合求和。如下图所示:

在计算过程中需要将数据重新分区的现象就可称为shuffle,shuffle前后的RDD划分到不同的Stage(理解为阶段或步骤)。以上描述的就是产生shuffle的原因,Spark对这一过程进行了抽象并通过不同的方式实现了这一过程(后续再讨论Spark源代码中shuffle的实现),以满足更多场景的计算需求及性能需求。

在ParallelCollectionRDD、MapPartitionsRDD、ShuffledRDD的compute方法添加如下打印:

运行该测试用例,日志打印如下。

从上面的日志可以看出如下几点:

pairsRdd(即ParallelCollectionRDD_0,因为这两个RDD的id都为0,简记为 RDD_0)和filterRdd(即MapPartitionsRDD_1)都属于stage_0,reduceRdd(即ShuffledRDD_2)属于stage_1。对stage_0中的RDD_0 和RDD_1,仍然是嵌套调用各RDD的compute方法,即先调用RDD_1的compute方法,再调用RDD_0的compute方法, RDD_0的compute方法执行完后,再执行RDD_1的compute方法。stage_0中各RDD各split的compute方法执行完后,再执行stage_1的compute方法。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java集合框架入门之泛型和包装类
下一篇:无线振弦采集仪远程修改参数的方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~