58、Spark性能优化之reduceByKey和groupByKey

groupByKey

val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum))


groupByKey工作原理.png

groupByKey的性能,相对来说,是有问题的
因为,它是不会进行本地聚合的,而是原封不动的,把ShuffleMapTask的输出,拉取到ResultTask的内存中,所以这样的话,会导致,所有的数据,都要进行网络传输,从而导致网络传输的性能开销很大
但是,有些场景下,用其他算法实现不了的,比如reduceByKey,sortByKey,countByKey实现不了的话,还是只能用groupByKey().map()来实现,比如可能你需要拿到某个key对应的所有的value,进行自定义的业务逻辑处理

reduceByKey

val counts = pairs.reduceByKey(_ + _)


reduceByKey原理.png

HashShuffleWriter的writer()方法,是先判断了一下,如果是isMapCombined,那么就在本地进行聚合,聚合之后,再写入磁盘文件
对于,仅仅是要对key对应的values进行聚合为一个值的场景,用reduceByKey是非常合适的,因为会先在ShuffleMapTask端写入本地磁盘文件的时候,进行本地聚合,再写入磁盘文件,此时,就会导致数据量大幅度缩减,甚至可能达到数据量缩减了几倍,甚至十几倍、几十倍的程度
这样的话,也就相当于,ShuffleMapTask端的数据,传输到ReduceTasl端的数据,数据量大幅度缩减,性能大幅度增加,甚至达到减少数据量的时间,几倍、十几倍、几十倍

如果能用reduceByKey,那就用reduceByKey,因为它会在map端,先进行本地combine,可以大大减少要传输到reduce端的数据量,减小网络传输的开销。
只有在reduceByKey处理不了时,才用groupByKey().map()来替代。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所能分配的CPU数...
    miss幸运阅读 8,429评论 3 15
  • 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的...
    Alukar阅读 4,413评论 0 2
  • 在我们目睹国家面临的可悲情况(指美国总统克林顿的绯闻案),想到这些事是如何发生时,也许会问自己一些问题,在我...
    董青青阅读 1,688评论 0 0
  • 一、基本语法 二、变量 三、运算符 四、分支结构 五、循环结构 六、函数
    憧憬001阅读 1,238评论 0 0
  • 生活不只是眼前的苟且,还有诗和远方,远方,也有过去的时光 夜晚不只是我一个人的,梦到了,醒了,再睡,哪里还...
    Phyllis一阅读 606评论 0 0

友情链接更多精彩内容