map端调优
io.sort.mb int 100 排序map输出时所使用的内存缓冲区的大小
io.sort.record.percent float 0.05 用作存储map输出记录边界的io.sort.mv的比例,神域的空间用来存储map输出记录本身, 1.0版本后删除该属性
io.sort.spill.percent float 0.8 map输出内存缓冲和用来开始磁盘溢出写过程的记录边界索引,这两者使用比例的阈值
io.sort.factor int 10 排序文件时,一次最多合并的流数,这个属性也在reduce中使用, 将此值增加到100也是很常见的
min.num.spills.for.combiner int 3 运行combiner所需要的最少溢出文件数(如果已制定了combiner)
mapred.compress.map.output boolean false 压缩map输出
mapred.map.output.compression.codec class name org.apache.hadoop.io.compress.DefaultCodec 用户压缩map输出的压缩编码器
tasktracker.http.threads int 40 每个tasktracker的工作线程数,用于将map输出到reducer这是集群范围的设置,不能由单个作业设置,在MR2中不使用。
总的原则是给shuffle过程精良多的提供内存空间, 然后有一个平衡问题,也就是要确保map函数和reduce函数能得到足够多的内存来运行,这就是为什么编写map函数和reducer函数要江梁少用内存,他们不能无限使用内存(避免在map中堆积数据)
运行map任务和reducer任务的JVM,其内存大小由mapred.child.java.ops属性设置,任务节点上的内存大小应该精良打,
在map端,可以通过避免多次溢出写磁盘来获得最佳性能;一次是最佳的情况。如果能估算map输出大小,就可以合理的设置io.sort.* 属性来尽可能减少溢出写的次数。具体而言,如果可以。就要增加io.sort.mb的值,MR计数器(spilled records) 计算在作业运行整个阶段中溢出写磁盘的记录数量,这对调优很有帮助,注意这个计数器包括map和reduce两端的溢出
在reducer端,中间数据全部驻留在内存时,就能获得最佳性能,在默认情况下,这是不可能发生的。 因为所有恩赐一般都预留给reduce函数, 但如果reduce函数的内存需求量不大,把mapred.inmem.merge.threshold设置为0, 把mapred.job.reduce.input.buffer.percen设置为 1.0或者一个更低的值,详见表6.2就可以提升性能。
reduce端的调优属性
mapred.reduce.parallelcopies int 5 用于把map输出复制到reducer的线程数
mapred.reduce.copy.backoff int 300 在声明失败之前,reducer获取一个map输出所花的时最大时间,以秒为单位,如果失败(根据指数后退),reduer可以在此时间内尝试重传。
io.sor.factor inr 10 排序文件时一次最多合并的流数量,这个属性也在map端使用
mapred.job.shuffle.input.buffer.percent float 0.7 在shuffle的复制阶段,分配给map输出的缓冲区占堆空间的百分比,
mapred.iob.shuffle.merge.percent float 0.66 map端输出缓冲区由mapred.job.shuffle.input.buffer.percent定义 的阈值使用比例,用于启动合并输出和磁盘溢出写的过程
mapred.inmem.merge.threshold int 1000 启动合并输出和磁盘溢出写过程的map输出的阈值数0或者更小的数字意味着没有阈值限制,溢出写行为由mapred.job.shuffle.merge.percent单独控制
mapred.iob.reduce.input.buffer.percent float 0.0 在reduce过程中,在内存中保持map输出的空间站整个对空间的比例,reduce
阶段开始时,内存中的map输出大小不能大于这个值。默认情况下,在recue的任务开始之前,所有map输出给合并到磁盘上,以便为reducer提供尽可能多个内存,然后,如果reduer需要的内存较少,可以增加比值来最小化访问磁盘的次数。
更加常见的情况是hadoop使用默认的4kb的缓冲区,这是很低的, 因此应该在集群中增加这个值,通过设置io.file.buffer.size来设置
2008年 hadoop通过在TB字节排序基准测试中获取, 他使用了一个优化方法即将中间数据保存在reduce端的内存中。。