1.hadoop解决数据倾斜的方法。
首先什么是数据倾斜?以及现象
比如一个文件 a b c
a 一亿个 map1
b 1个 map2
c 1个 map3
做wordcount
以及现象: map1 99% map2 100% mp3 100%
如何解决数据倾斜:
1.combiner (a,1),....(a,1)->(a.1亿) 减少网络传输
但是avg不适合,如果导致数据倾斜的文件的key分布在很多文件中,不同的mapper 这种就不太适用
2.如果导致数据倾斜的文件的key分布在很多文件中
2.1 局部聚合+全局聚合
第一次map :对于导致数据倾斜的key,加上一个随机数前缀 ,这样原本相同的key也会分到不同的reduce中进行局部聚合
第二次map:去掉前缀key,进行全局聚合
思想:两次MR,第一次将key随机散列到不同的reduce中处理,达到负载均衡,
第二次再根据去除掉key的随机前缀,按照原本的key进行reduce处理
2.2 增加reduce数,提高并行度
job.setNumReduceTasks(3);
也可以设置0,reduce就不输出了,直接显示map结果
2.3 实现自定义分区。
partitioner :按照某种规则(可以自定义)对map输出的数据进行分区操作。默认的是HashPartitner
顺序:map-》Partitioner-》reduce