乐趣区

如何解决大数据计算中常见的数据倾斜问题

数据倾斜是在大数据计算中常见的问题,用最通俗易懂的话来说, 数据倾斜无非就是大量的相同 key 被 partition 分配
到一个分区里, 造成了 ’ 一个人累死, 其他人闲死 ’ 的情况, 这种情况是我们不能接受的, 这也违背了并行计算的初衷, 首先
一个节点要承受着巨大的压力, 而其他节点计算完毕后要一直等待这个忙碌的节点, 也拖累了整体的计算时间, 可以说
效率是十分低下的。
以下针对 spark 具体计算场景,给出数据倾斜解决方案:
场 景
当 RDD 执行 reduceByKey 等聚合类 shuffle 算子或者在 Spark SQL 中使用 group by 语句进行分组聚合时,产生数据
倾斜。
出现数据倾斜原因:
在上述分组场景中,具有相同的 key 的数据就会被分配到同一个组当中,从而分配到同一分区。如果某些相同 key
的数据量非常大,而其他是 key 的数据量相对较小,此时就可能产生比较严重的数据倾斜。
解决方案
本方案通过两个阶段聚合:
阶段一
先给每个 key 都打上一个随机数,比如 10 以内的随机数,比如 (spark,1) (spark, 1) (spark, 1) (spark, 1),就会变成
(1_spark, 1) (1_spark, 1) (2_spark, 1) (2_spark, 1)。打上随机数以后,原先一样的 key 就变成不一样的了。然后对
数据进行 reduceByKey 等聚合操作,局部聚合结果变成了 (1_spark, 2) (2_spark, 2)。
阶段二
基于阶段一局部聚合的数据,将各个 key 的前缀给去掉,就会变成 (spark,2)(spark,2),再次进行全局聚合操作,得
到最终结果,比如(spark, 4)。

小结
数据倾斜是大数据计算中常见的问题,很多场景的计算都会出现数据倾斜的情况,而解决数据倾斜的主体思路都是
在计算过程当中尽量能将数据均匀地分配到各个分区,从而充分提高每个计算节点的利用率,提高整体的计算效
率。本文当中是针对 spark 一个计算场景出现数据倾斜问题给出解决方案。

更多资源请关注黑马程序员广州中心官方公号获取。

退出移动版