<configuration>
<property>
<name>mapreduce.task.timeout</name>
<value>600000</value>
</property>
<property>
<name>mapreduce.cluster.local.dir</name>
<value>/hadoop/mapred</value>
<!-- 这两个参数决定把 Hadoop 中的数据放在什么地方,mapred.local.dir 决定存储 MapReduce 中间数据
( map 输出数据)的位置,dfs.data.dir 决定存储 HDFS 数据的位置。 -->
</property>
<property>
<name>mapreduce.reduce.input.buffer.percent</name>
<value>0.0</value>
<!-- 默认值是: 0;
说明:这个参数设置用于在 reduce 阶段保存 map 输出的内存的百分比(相对于最大堆大小),当 shuffle 结束时,内存中剩余的 map 输出必须少于这个阈值,然后 reduce 阶段才能够开始。
这个值越大,磁盘上的合并就越少,因此会减少 reduce 阶段本地磁盘上的 I/O 时间。如果 map 输出很大而且在 reduce 到排序阶段本地磁盘 I/O 很频繁,应该尝试增加这个值。
注意,如果给每个任务分配的内存不够大,增加这个值可能会导致更多垃圾收集活动。-->
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
<!-- jobhistory web UI-->
</property>
<property>
<name>mapreduce.cluster.reducememory.mb</name>
<value>2048</value>
<!--每个reduce slot预留的内存-->
</property>
<property>
<name>mapred.cluster.max.reduce.memory.mb</name>
<value>4096</value>
<!-- 每个reduce task使用的内存上限-->
</property>
<property>
<name>mapred.cluster.max.map.memory.mb</name>
<value>6144</value>
<!--每个map task使用的内存上限-->
</property>
<property>
<name>mapred.cluster.map.memory.mb</name>
<value>1536</value>
<!-- 新版本使用参数,每个map slot预留的内存-->
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
<!--map/reduce阶段申请的container的内存的大小-->
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
<!--每个Reduce Task需要的内存量 -->
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
<!-- 默认值是 -Xmx200m,说明:与内存相关的参数,同时这是这个参数用于 JVM 调优的主要参数。这给每个子任务线程分配最多 200 MB 内存。
如果作业很大,可以增加这个值,但是应该确保这不会造成交换,交换会严重降低性能。我们来研究一下这个参数如何影响总内存使用量。
假设 map/reduce 任务的最大数量设置为 7,mapred.child.java.opts 保持默认值。那么,正在运行的任务的内存开销为 2x7x200 MB =2800 MB。
如果每个工作者节点都有 DN 和 TT 守护进程,每个守护进程在默认情况下占用 1 GB 内存,那么分配的总内存大约为 4.8 GB。
在 mapred-site.xml 中设置此参数。jvms启动的子线程可以使用的最大内存。改为-Xmx1024m,内存再大也可以继续增加。
但是如果一般任务文件小,逻辑不复杂用不了那么多的话太大也浪费。 -->
</property>
<property>
<name>mapreduce.tasktracker.healthchecker.script.path</name>
<value>file:////mapred/jobstatus</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
<property>
<name>mapred.task.tracker.task-controller</name>
<value>org.apache.hadoop.mapred.DefaultTaskController</value>
<!--任务管理器的设定-->
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.map.sort.spill.percent</name>
<value>0.1</value>
<!-- 这个值就是上述buffer的阈值,默认是0.8,即80%,
当buffer中的数据达到这个阈值,后台线程会起来对buffer中已有的数据进行排序,然后写入磁盘。-->
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
<!--jobhistory 节点服务器端口-->
</property>
<property>
<name>mapreduce.map.speculative</name>
<value>false</value>
<!-- 默认值: TRUE,map任务的多个实例可以并行执行 -->
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>BLOCK</value>
<!-- 默认值:false 这些参数控制是否对输出进行压缩,磁盘 I/O 相关的参数
说明:mapreduce.output.fileoutputformat.compress.type 用于 map 输出压缩;-->
</property>
<property>
<name>mapreduce.map.output.compress</name>
<value>FALSE</value>
<!--20140312 add 用于作业输出压缩; -->
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.DefaultCodec</value>
<!-- 20140312 add 用于压缩代码;-->
<!-- 启用输出压缩可以加快磁盘(本地/Hadoop Distributed File System (HDFS))写操作,减少数据传输的总时间(在 shuffle 和 HDFS 写阶段),但是在另一方面压缩/解压过程会增加开销。
经验:启用压缩对于使用随机键/值的操作序列是无效的。建议只在处理大量有组织的数据(尤其是自然语言数据)时启用压缩。中间结果和最终结果是否要进行压缩,
如果是,指定压缩方式(Mapred.compress.map.output.codec/ Mapred.output.compress.codec)。推荐使用LZO压缩。Intel内部测试表明,相比未压缩,使用LZO压缩的TeraSort作业运行时间减少60%,且明显快于Zlib压缩。-->
</property>
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>200</value>
<!-- 默认值:100M 说明:这个参数设置用于 map 端排序的缓冲区大小,单位是 MB,默认值是 100。
这个值越大,溢出到磁盘就越少,因此会减少 map 端的 I/O 时间。注意,增加这个值会导致每个 map 任务需要的内存增加。
根据**经验,在 map 输出很大而且 map 端 I/O 很频繁的情况下,应该尝试增加这个值。Map task的输出结果和元数据在内存中所占的buffer总大小。对于大集群,可设为200M。
当buffer达到一定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件)。-->
</property>
<property>
<name>mapreduce.reduce.merge.inmem.threshold</name>
<value>1000</value>
<!--内存中的合并文件数设置-->
</property>
<property>
<name>mapreduce.shuffle.port</name>
<value>8081</value>
</property>
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
<!-- 设定任务的执行计划实现类 -->
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>100</value>
<!-- 默认值:10 说明:当一个map task执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,map task最后做的一件事就是执行merge sort,把这些spill文件合成一个文件(partition)。
执行merge sort的时候,每次同时打开多少个spill文件由该参数决定。打开的文件越多,不一定merge sort就越快,所以要根据数据情况适当的调整。
这个参数设置在 map/reduce 任务中同时合并的输入流(文件)数量。这个值越大,溢出到磁盘就越少,因此会减少 map/reduce 的 I/O 时间。
注意,如果给每个任务分配的内存不够大,增加这个值可能会导致更多垃圾收集活动。
根据**经验,如果出现大量溢出到磁盘,而且排序和 shuffle 阶段的 I/O 时间很高,就应该尝试增加这个值。 -->
</property>
<property>
<name>mapreduce.jobtracker.system.dir</name>
<value>/mapred/system</value>
</property>
<property>
<name>mapreduce.jobtracker.tasktracker.maxblacklists</name>
<value>16</value>
<!--如果tasktrack上有超过4次失败(mapreduce.job.maxtaskfailures.per.tracker 默认值:3次),jobtracker将会把当前 tasktracker加入黑名单,
不会再分配任务。在这之前分配的工作任务可以继续使用,被加入黑名单的节点,重启后可以重新加入集群。-->
</property>
<property>
<name>mapreduce.reduce.shuffle.input.buffer.percent</name>
<value>0.7</value>
<!-- shuffle 阶段内存使用的最大值,默认为0.7-->
</property>
<property>
<name>mapreduce.job.maps</name>
<value>6</value>
<!-- 每个Job的Map个数,默认为2,调整为6 -->
</property>
<property>
<name>mapreduce.job.reduces</name>
<value>3</value>
<!-- 每个Job的Reduce个数,默认为1,调整为3 -->
</property>
<property>
<name>mapreduce.reduce.shuffle.merge.percent</name>
<value>0.66</value>
<!--默认值: 0.66 说明:reduce归并接收map的输出数据可占用的内存配置百分比。类似mapreduce.reduce.shuffle.input.buffer.percen属性。 -->
</property>
<property>
<name>mapred.jobtracker.maxtasks.per.job</name>
<value>-1</value>
<!-- 一单独作业的最大任务数,-1为不限制-->
</property>
<property>
<name>mapreduce.job.reduce.slowstart.completedmaps</name>
<value>0.05</value>
<!-- 在maptask完成了一定百分比后将触发fetch,默认为0.05-->
</property>
<property>
<name>mapreduce.tasktracker.healthchecker.script.timeout</name>
<value>60000</value>
<!--mapreduce健康检查超时时间 -->
</property>
<property>
<name>mapreduce.reduce.input.limit</name>
<value>10737418240</value>
<!-- Reduce输入量的限制,-1是不限制。-->
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>30</value>
<!-- 默认值是 5:这个参数决定把 map 输出复制到 reduce 所使用的线程数量。
增加这个值可以提高网络传输速度,加快复制 map 输出的过程,但是也会增加 CPU 使用量。
根据**经验,增加这个值的效果不太明显,建议只在 map 输出非常大的情况下增加这个值。
Reduce shuffle阶段copier线程数。默认是5,对于较大集群,可调整为16~25。 -->
</property>
<property>
<name>mapreduce.tasktracker.reduce.tasks.maximum</name>
<value>4</value>
<!-- 默认值是 2:与 CPU 相关的参数:说明:决定由任务跟踪器同时运行的 map/reduce 任务的最大数量。
这两个参数与 CPU 利用率最相关。这两个参数的默认值都是 2。根据集群的具体情况适当地增加它们的值,这会提高 CPU 利用率,由此提高性能。
例如,假设集群中的每个节点有 4 个 CPU,支持并发多线程,每个 CPU 有两个核;那么守护进程的总数不应该超过 4x2x2=16 个。
考虑到 DN 和 TT 要占用两个,map/reduce 任务最多可以占用 14 个,所以这两个参数最合适的值是 7。 -->
</property>
<property>
<name>mapreduce.tasktracker.map.tasks.maximum</name>
<value>4</value>
<!-- 默认值是 2:原理同 mapreduce.tasktracker.reduce.tasks.maximum -->
</property>
<property>
<name>mapreduce.reduce.speculative</name>
<value>false</value>
<!--是否对Reduce Task启用推测执行机制-->
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<!-- 新框架支持第三方 MapReduce 开发框架以支持如 SmartTalk/DGSG 等非 Yarn 架构,注意通常情况下这个配置的值都设置为 Yarn,
如果没有配置这项,那么提交的 Yarn job 只会运行在 locale 模式,而不是分布式模式-->
</property>
<property>
<name>mapred.userlog.retain.hours</name>
<value>24</value>
<!--作业完成后的用户日志留存时间为24小时-->
</property>
<property>
<name>mapreduce.admin.map.child.java.opts</name>
<value>-server -XX:NewRatio=8 -Djava.library.path=/usr/lib/hadoop/lib/native/ -Djava.net.preferIPv4Stack=true</value>
<final>true</final>
<!--管理员设定的map/reduce阶段申请的container的默认JVM启动参数。启动container的命令行会先连接管理员设定参数,然后再连接用户设定参数。-->
</property>
<property>
<name>mapreduce.admin.reduce.child.java.opts</name>
<value>-server -XX:NewRatio=8 -Djava.library.path=/usr/lib/hadoop/lib/native/ -Djava.net.preferIPv4Stack=true</value>
<final>true</final>
<!--管理员设定的map/reduce阶段申请的container的默认JVM启动参数。启动container的命令行会先连接管理员设定参数,然后再连接用户设定参数。-->
</property>
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
<!--压缩和解压的方式设置-->
</property>
</configuration>