数据倾斜是在大数据计算中常见的问题,用最通俗易懂的话来说,数据倾斜无非就是大量的相同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一个计算场景出现数据倾斜问题给出解决方案。
更多资源请关注黑马程序员广州中心官方公号获取。
原文地址:https://blog.51cto.com/14360146/2404392