1、 combiner函数,规约Map的结果,降低Reduce的压力
2、 定期运行均衡器,平衡集群上的数据块分布。
3、 对map的中间结果进行压缩(对优化可能有用)
mapper的数量 | mapper需要运行多长时间?如果平均只要几秒钟,则可以看是否能用更少 | 7.2.2节 |
reducer的数量 | 为了达到最高性能,集群中reducer数应该略少于reducer的任务槽数。这将使 | 7.1.1节 |
combiner | 作业能否充分利用combiner来减少通过shuffle传输的数据量。 | 2.4.2节 |
中间值的压缩 | 对map输出进行压缩几乎总能使作业执行的更快。 | 4.2.3节 |
自定义序列 | 如果使用自定义的writable对象或者自定义的comparator,则须确保已实现RawComparator | 4.3.3节 |
调整shuffle | MapReduce的shuffle过程可以对一些内存管理的参数进行调整,以弥补性能的不足 |
map端的调优属性
属性名称 | 类型 | 默认值 | 说明 |
io.sort.mb | int | 100 | 排序map输出时所使用的内存缓冲区的大小,以兆字节为单位 |
io.sort.record.percent | float | 0.05 | 用作存储map输出记录边界的io.sort.mb的比例。剩余的空间用来存储map输出记录本身。 |
io.sort.spill.percent | float | 0.80 | map输出内存缓冲和用来开始磁盘溢出写过程的记录边界索引,这两者使用比例的阀值。 |
io.sort.factor | int | 10 | 排序文件时,一次最多合并的流数。这个属性也在reduce中使用。将此值增加到100是很常见的。 |
min.num.spills.for.combine | 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。这是集群范围的设置,不能由单个作业设置。在Mapreduce2中不适用。 |
reduce端的调优属性
属性名称 | 类型 | 默认值 | 描述 |
mapred.reduce.parallel.copies | int | 5 | 用于把map输出复制到reducer的线程数 |
mapred.reduce.copy.backoff | int | 300 | 在声明失败之前,reducer获取一个map输出所花的的最大时间,已秒为单位。 |
io.sort.factor | int | 10 | 排序文件时一次最多合并的流的数量。这个属性也在map端使用。 |
mapred.job.shuffle.input.buffer.percent | float | 0.70 | 在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.iob.reduce.input.buffer.percent | float | 0.0 | 在reduce过程中,在内存中保存map输出的空间占整个堆空间的比例。reduce阶段开始时, |
Hadoop使用默认4KB的缓冲区,可以设置io.file.buffer.size属性来增加它。
在reduce端,中间数据全部在内存就可以获得最佳性能。如果reduce函数的内存需求不大,可以把mapred.inmem.merge.threshold设置为0,把mapred.iob.reduce.input.buffer.percent设置为1.0,可以提高性能。
推测执行(SpeculativeExecution)
Speculative Execution机制的为了解决Hadoop中出现缓慢某些Task拖延整个Job运行的问题,Speculative Execution会针对那些慢于平均进度的Task启动Speculative Task,此时如果原Task在Speculative Task前完成,则Speculative Task会被终止,同样的,如果Speculative Task先于原Task完成则原来的Task会被终止
默认情况下SpeculativeExecution是启用的,下面的属性可以控制是否开启该功能:但是关闭推测执行,只针对某些任务开启推测执行,有利于提高集群的效率。
跳过坏记录
在大数据中经常有一些损坏的记录,当Job开始处理这个损坏的记录时候,导致Job失败,如果这些记录并不明显影响运行结果,我们就可以跳过损坏记录让Job成功运行
Task JVM重用
启动JVM重用后,可以让不同Task重用一个JVM,节省了重建销毁JVM的时间,在Hadoop2.0中默认情况不提供这种功能
4、