在Map端进行combine预聚合
Combiner对每一个maptask的输出进行局部汇总,减少数据的传输量。把一个mapper中相同的key进行聚合,计算规则和reduce一致。减少shuffle过程中传输的数据量,以及reducer端的计算量。
如果导致数据倾斜的key大量分布在不同的mapper时候,该方法不是很有效。
数据倾斜的key分布在不同的mapper
局部聚合+全局聚合(性能稍差)
有两次MR。第一次在map阶段对导致数据倾斜的key加上随机数前缀,这样将相同的key分布到不同的reducer中进行局部聚合,达到负载均衡的目的。第二次去掉key的随机数前缀,按照原key进行全局聚合。
增加reducer,提高并行度
JobConf.setNumReduceTasks(int)
实现自定义分区
自定义散列函数,将key均匀分布到不同的Reducer中。