使用hadoop进行大数据运算,当数据量及其大时,那么对MapReduce性能的调优重要性不言而喻。尤其是Shuffle过程中的参数配置对作业的总执行时间影响特别大。下面基于官网和工作中的情况总结和相关的调优策略。
1.关于map端的调优属性
属性名称 | 类型 | 默认值 | 说明 |
mapreduce.task.io.sort.mb | int | 100 | 配置排序map输出时所能使用的内存缓冲区的大小,默认100Mb,实际开发中可以适当设置大一些。要尽量避免多次溢出写磁盘的的情况,一次溢出写是最佳性能的情况,如果可以,实际开发中可以尽量增加mapreduce.task.io.sort.mb的值。 |
mapreduce.map.sort.spill.percent | float | 0.80 | map输出内存缓冲和用来开始磁盘溢出写过程的记录边界索引的阈值,即最大使用环形缓冲内存的阈值。一般默认是80%。也可以直接设置为100% |
mapreduce.task.io.sort.factor | int | 10 | 排序文件时,一次最多合并的流数。日常开发中可以将这个值设置为100 |
mapreduce.map.combine.minispills | int | 3 | 运行combiner所需要的最小溢出文件数,一般溢出文件数小于3个,就不会启动combiner进行合并,否则因为combiner会增加开销 |
mapreduce.map.output.compress | Boolean | false | 是否压缩map的输出,如果是大文件的话,可以开启压缩,这样好处是减少网络IO,加速传输 |
mapreduce.map.output.compress.codec | Class name | org.apache.hadoop.io.compress.DefalutCo-dec |
用于map输出的压缩编码器。
注意:大文件来说,一般不要使用不支持切分整个文件的压缩格式,这样会失去数据的本地特性,造成mapreduce应用效率低下。常用的压缩有LZO.LZ4,gzip,bzip2,snappy等等。
|
mapreduce.shuffle.max.threads | int | 0 | 每个nodemanager工作的线程数,用于将map输出到reducer.这是集群范围的设置,不能由单一的作业区设置。0表示使用Netty默认值,即两倍于可用的 |
2.关于reduce端的调优属性
通常来说,在reduce端如果把中间数据全部驻留在内存中,那么肯定可以获取最佳性能,但默认情况下,不会发生。因为默认要预留很多内存给reduce函数进行运算。
属性名称 | 类型 | 默认值 | 说明 |
mapreduce.reduce.shuffle.palallelcopies | int | 5 | 用于把map输出复制到reducer端的线程数 |
mapreduce.reduce.shuffle.maxfetchfailures | int | 10 | 在声明失败之前,reducer获取一个map输出所允许花的最大时间 |
mapreduce.task.io.sort.factor | int | 10 | 排序文件时,一次最多合并的流数。日常开发中可以将这个值设置为100 |
mapreduce.reduce.shuffle.input.buffer.percnet | float | 0.70 | 在shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比。 |
mapreduce.reduce.shuffle.merge.percnet | float | 0.66 | map输出缓冲区的阈值使用比例,用于启动合并输出和磁盘溢出写的过程 |
mapreduce.reduce.merge.inmem.threshold | int | 1000 | 启动合并输出和磁盘溢出写过程的map的输出阈值。0或者更小表示没有阈值限制。溢出写行为由上面的mapreduce.reduce.shuffle.merge.percent控制。 |
mapreduce.reduce.input.buffer.percent | float | 0.0 | 在reduce的过程中,在内存中保存map输出的空间占堆空间的比例,reduce阶段开始时,内存中的map的输出大小不能大于这个值。默认情况下,在reduce开始任务之前,所有的map输出都合并到磁盘上,以便为reducer提供尽可能多的内存。然而,如果reducer需要的内存比较小,可以通过增加这个值来最小化访问磁盘的的次数。进而提高程序运行效率。比如2008年hadoop在通用的TB字节的排序基准测试中获胜,其中很重要的一个优化方法就是 :将中间数据保存到reduce端的内存中 |