产生原因:
***在MapperReduce做计算的时候会产生数据的侵写,因为不合理的key,导致了数据的分布不均匀。
**
解决方案
**
选择合适的key作为统计依据,使得数据能够在分区中均匀分布。一般需要程序员对分析的数据有一定的预判。
1. 开启map端的压缩
可以减少reduce shuffle 过程中的网络带宽;弊端:在计算的过程中需要消耗额外的CPU进行数据的压缩和解压缩。
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec",
Lz4Codec.class, CompressionCodec.class);
注意:此方案适合在集群环境下使用。如果是本地测试。会出现not a gzip file 的错误。
- **
2. combiner
**
MapReduce 计算,是在map端的优化。
假如我有一段文字我需要统计他的出现次数:
A A B B C C D A E E B F…
问题: **1)之前的map段的排序是直接对内容进行排序**:
A 1
A 1
B 1
B 1
C 1
C 1
.........
**Reduce端会把这些进行排序的文件下载再次进行reduce的归并、排序。**
A 2
B 2
C 2
......
注意:如果100亿条无序出现的数字需要进行排序。那么在我reduce端下载map端的数据会占用大量的带宽。
方案:2)在map端文件的排序进行优化。执行reduce端的方法进行排序。这样我传输的数据量就会有一个质的下降。
排序:
A 2
B 2
C 2
…
注意: combiner 结果类型必须一致;统计过程必须支持局部计算。