MapReduce优化——配置调优

相关链接: MapReduce优化——Combiner与Partitioner

1、配置调优

调优总的原则给shuffle过程尽量多提供内存空间,在map端,可以通过避免多次溢出写磁盘来获得最佳性能(相关配置io.sort.*,io.sort.mb),在reduce端,中间数据全部驻留在内存时,就能获得最佳性能,但是默认情况下,这是不可能发生的,因为一般情况所有内存都预留给reduce含函数(如需修改 需要配置mapred.inmem.merge.threshold,mapred.job.reduce.input.buffer.percent)

如果能够根据情况对shuffle过程进行调优,对于提供MapReduce性能很有帮助。
一个通用的原则是给shuffle过程分配尽可能大的内存,当然你需要确保map和reduce有足够的内存来运行业务逻辑。因此在实现Mapper和Reducer时,应该尽量减少内存的使用,例如避免在Map中不断地叠加。
运行map和reduce任务的JVM,内存通过mapred.child.java.opts属性来设置,尽可能设大内存。容器的内存大小通过mapreduce.map.memory.mb和mapreduce.reduce.memory.mb来设置,默认都是1024M。

可以通过以下方法提高排序和缓存写入磁盘的效率:

  1. 调整mapreduce.task.io.sort.mb大小,从而避免或减少缓存溢出的数量。当调整这个参数时,最好同时检测Map任务的JVM的堆大小,并必要的时候增加堆空间。
  2. mapreduce.task.io.sort.factor属性的值提高100倍左右,这可以使合并处理更快,并减少磁盘的访问。
  3. 为K-V提供一个更高效的自定义序列化工具,序列化后的数据占用空间越少,缓存使用率就越高。
  4. 提供更高效的Combiner(合并器),使Map任务的输出结果聚合效率更高。
  5. 提供更高效的键比较器和值的分组比较器。

输出依赖于作业中Reduce任务的数量,下面是一些优化建议:

  1. 压缩输出,以节省存储空间,同时也提升HDFS写入吞吐量
  2. 避免写入带外端文件(out-of-band side file)作为Reduce任务的输出
  3. 根据作业输出文件的消费者的需求,可以分割的压缩技术或许适合
  4. 以较大块容量设置,写入较大的HDFS文件,有助于减少Map任务数

2、Map/Reduce端调优

通用优化
Hadoop默认使用4KB作为缓冲,这个算是很小的,可以通过io.file.buffer.size来调高缓冲池大小。

map端优化
避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的。通过估计map的输出大小,设置合理的mapreduce.task.io.sort.*属性,使得spill文件数量最小。例如尽可能调大mapreduce.task.io.sort.mb。
MapReduce优化——配置调优_第1张图片

reduce端优化
如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。在TB级别数据排序性能测试中,Hadoop就是通过将reduce的中间数据都保存在内存中胜利的。
这里写图片描述
MapReduce优化——配置调优_第2张图片

你可能感兴趣的:(hadoop)