老铁们,勾叔来了!!!今天,勾叔传授大家消除数据倾斜的六大秘籍~~
由于大数据的处理流程中产生数据倾斜的阶段主要是Map和Reduce两大阶段,因此我们着手消除这两个阶段产生的数据倾斜。
秘籍一
消除map端的数据倾斜
由于文件采用了不支持splittable的压缩算法或者文件大小不一致,导致map端的数据倾斜,如下:
解决方案:增加数据预处理。
消除map端的数据倾斜后,接下来,勾叔与大家一起来消除reduce端的数据倾斜。
秘籍二
消除reduce端的数据倾斜之过滤异常数据
对key进行的数据特征分析,可以发现是否有异常数据:
- null(空值)或是一些无意义的信息之类的,大多是这个原因引起
- 无效数据,对结果影响不大的有效数据或是大量重复的测试数据
- 正常数据,业务导致的数据分布
解决方案:对于前两种情况,我们只需要对数据进行预处理和过滤即可。
秘籍三
消除reduce端的数据倾斜之 map side join
由于正常执行join操作时,要对数据进行分区,因此不可避免的带来了shuffle。
解决方案:如果是大表与小表做关联,可采用 map side join,彻底的消除shuffle,进而规避数据倾斜。
秘籍四
消除reduce端的数据倾斜之改变Reduce的并行度
通过调整并行度,从而改变Shuffle过程中数据的去向,进而消除数据倾斜。
秘籍五
消除reduce端的数据倾斜之两阶段聚合
- 加盐打散key。给每个key都加一个随机数(如10以内的随机数)【加盐】,此时 key 被打散。
- 局部聚合。对打上随机数的key,执行一次聚合操作,得到结果。
- 全局聚合。将 key 的前缀/后缀去掉,再进行一次聚合操作,得到最终结果。
截止到现在,老铁们一定对加盐打散key的操作有点懵,不知道该在哪里进行加盐打散key?别急,勾叔继续带大家一起往下看。
秘籍六
消除reduce端的数据倾斜之加盐打散key
通过一张图,给老铁们展示加盐打散key操作。
下面,结合实际场景,勾叔带大家一起来搞加盐打散key。
场景再现1:
- 在join的时候发生数据倾斜,经检测数据倾斜是由少数key的数据量大造成的;
- 少数key相同的数据,数据量大,集中在部分分区,而无法打散。
解决方案:
- 为数据量特别大的Key增加随机前/后缀,使得这些 Key 分散到不同的task中;
- join的另一侧数据,找到与倾斜Key对应的部分数据,与随机前缀集作笛卡尔乘积,保证无论数据倾斜侧倾斜Key如何加前缀,都能与之进行正常Join操作;
- join操作后,再去除随机前/后缀。
场景再现2:
在join的时候发生数据倾斜,经检测出现数据倾斜的Key比较多,则无法将这些倾斜Key分拆出来。
解决方案:
直接对存在数据倾斜的数据集全部加上随机前缀,然后对另外一个数据集整体扩容,最后再进行join操作。
小结:对于数据倾斜,没有一劳永逸的方法;更多的时候,数据倾斜的产生并不是单个原因造成的,此时我们就需要结合数据源特点(数据集的特点、空值的多少、倾斜Key的多少等)、业务的特点以及数据倾斜产生的特点,将多种方案组合起来使用。勾叔希望大家要对这六大秘籍的解决思路和原理理解透彻,在实践中根据不同的情况,灵活运用多种方案,来解决相应的数据倾斜问题。
本文首发于公号 勾叔谈大数据
欢迎大家来找勾叔交流哦~