一、什么是数据倾斜
简而言之就是数据分布不均匀,某一个key非常多会导致那个Reduce主机压力大造成数据倾斜,造成集群的效率低下,一些任务出现卡死在99%的情况下不运行,资源的利用率低下
二、解决办法
1.提前在map进行combine,减少数据传输的数据量在mapper加上combiner相当于提前进行reduce,就是把mapper中相同的key进行了聚合,减少了shuffle过程中传输的数据量,以及reducer端的计算量
2.导致数据倾斜的key大量的分布在不同的mapper
1)局部聚合+全局聚合(性能稍差)
两次mr:第一次将导致数据倾斜的key加上1到n的随机前缀,随机散列到不同的reducer中进行处理达到负载均衡的目的,第二次再根据去掉key的随机前缀按原key进行reduce聚合。
2)增加reducer 提升并行度
3)自定义分区:根据数据分布情况,自定义散列函数,将key均匀分配到不同的reducer中