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
根据实际数据情况 让数据分配均匀。自定义散列函数
job.setPartitionerClass(HashPartitioner.class);
2.shuffe优化
2.1 Map端
1 小文件问题,少输入文件个数,对小文件合并
2 Combine
2.2 I/O
数据传输时进行压缩(Map-》Shuffe)
2.3 reduce端
1 设置map reduce共存。 map1 99% map2 100% mp3 100% 100%的就直接进行reduce操作
mapreduce.job.reduce.slowstart.completedmaps 默认 0.5
也就是说 map执行到5%的时候开始为reduce申请资源,开始reduce操作
2.尽量少用reduce 设置reduce数为0
reduce会产生大量的网络消耗,但是该用还是用
3.增加reduce ,提高并行度
2.4 整体
1 合理设置map数 和reduce数
2 mr on yarn yarn进行参数调优 Container
3 加配置(机器。内存等)
3 一些其他面试题
3.1是否可以只有map没有reduce
可以
3.2 是否可以只有reduce没有map
第一印象不可以
但是 hive野心很大 不想仅仅限制与sql ,想提供一个单独的,可以用Java编写的的hive自己的map/reduce框架(map不展示出来)
https://mp.weixin.qq.com/s/SkjHeuosdX-SzEC6AxGgGA