转载自知乎:https://zhuanlan.zhihu.com/p/370857623
1、原理层面的区别
groupByKey 不会在map端进行combine,而reduceByKey 会在map端的默认开启combine进行本地聚合。
在map端先进行一次聚合,很极大的减小reduce端的压力,一般来说,map的机器数量是远大于reduce的机器数量的。通过map聚合的方式可以把计算压力平均到各台机器,最终在reduce端只需要汇总map端聚合完成的数据即可,极大的提高效率。
看图如下:


reduceByKey
2、实战层面
主要说一下,自己在什么场景下使用groupByKey,使用的时候造成了什么问题,然后换到reduceByKey之后效率提升多少。
比如:(具体时间自己找一批数据跑一波就可以得出结论,根据实际跑的时间和数据量描述即可)
groupByKey 在计算每个用户请求次数的时候(数据量级30亿,用户量级3亿),使用groupByKey运行1个小时(甚至执行失败,reduce机器报内存溢出),换用reduceByKey之后,很好的解决了这个问题,从之前的1小时,缩短到了10分钟。
本文详细介绍了Spark中的groupByKey和reduceByKey操作的原理区别。groupByKey不会在map阶段进行局部聚合,可能导致reduce端内存溢出,而reduceByKey则在map端进行预聚合,有效减轻reduce节点压力。实战中,当处理30亿条数据、3亿用户请求次数时,使用groupByKey耗时1小时甚至失败,而切换到reduceByKey后,运行时间缩短至10分钟,显著提升了效率。
717

被折叠的 条评论
为什么被折叠?



