Spark中reduceByKey()和groupByKey()的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark中reduceByKey()和groupByKey()的区别相关的知识,希望对你有一定的参考价值。

参考技术A

在Spark当中,分组操作时,提供了这么两个函数,用WordCount程序来举例。

这两种做法的结果都是正确的。

在大的数据集上,reduceByKey()的效果比groupByKey()的效果更好一些。因为reduceByKey()会在shuffle之前对数据进行合并。

如图所示:
下面一张图就能表示 reduceByKey() 都做了什么。

而当我们调用 groupByKey() 的时候,所有的键值对都会被shuffle到下一个stage,传输的数据比较多,自然效率低一些。

原文: Spark中reduceByKey()和groupByKey()的区别(译)

Spark笔记004-reduceByKey和groupBykey

参考技术A 突然听同事提起,就随便写一下的。

做一个word count小例子,

groupByKey的过程 MapPartitionsRDD=>ShuffledRDD=>MapPartitionsRDD=>MapPartitionsRDD
也就是说,它是原封不动的,把ShuffleMapTask的输出,来去到ResultTask的内存中,所以导致所有数据都进行了网络传输
而如果是reduceByKey,看下shuffleMapTask的write的实现,判断了是否有mapSideCombine,如果有,就先本地聚合,再写磁盘,再传输。

谈之前要有个共识,分布式系统,网络传输是占时间比重高也非常影响效率的部分。
说些比较飘浮的内容,这其实是mapreduce比较经典的map端combine,也就是说因为是分布式系统啊,首先把数据分散到各个节点并行计算,算完了再把数据传到其他节点去做最终结果计算。那么在第一次计算之前,如果能先做一些对最终结果计算有帮助的计算,再去传输,就能节省一点网络传输时间。
说些更飘浮的内容啊,mr这种计算是为了算结果,也就是把数据的抽象程度变高了,那么,能越早的接近最终结果,越能节约时间。

如果有hadoop基础就知道,map端combine和reduce端combine逻辑一致才能得到最终结果。
如果不是,那就是如果需要对单key的所有value放在一起才能计算的逻辑不合适做这种优化。

以上是关于Spark中reduceByKey()和groupByKey()的区别的主要内容,如果未能解决你的问题,请参考以下文章

Spark中reduceByKey()和groupByKey()的区别

Spark笔记004-reduceByKey和groupBykey

Spark中的treeReduce与reduceByKey

spark Dataframe 中的 reducebykey 和 aggregatebykey

spark中reduce和reduceByKey的区别

在开始取决于reduceByKey结果的连接步骤之前,Spark是不是必须完成reduceByKey步骤中的所有条目的处理?