1.MapReduce shuffle处理程序和IFile阅读器使用本机Linux调用,在安装了Hadoop本机库的Linux系统上。
    2.改善随机处理程序
        1.您可以通过启用shuffle readahead来改进MapReduce shuffle处理程序的性能。
          这会导致TaskTracker或节点管理器在通过套接字将其发送到reducer之前预读取地输出。
        2.要为YARN启用此功能,请设置 mapreduce.shuffle.manage.os.cache 为 true (默认)。
          要进一步调整性能,请调整值mapreduce.shuffle.readahead.bytes。默认值为4 MB。
        3.要为MapReduce启用此功能,请设置 mapred.tasktracker.shuffle.fadvise 为 true (默认)。
          要进一步调整性能,请调整值mapred.tasktracker.shuffle.readahead.bytes。默认值为4 MB。

    3.改善IFile阅读器的性能 IFile Reader
        启用IFile预读可提高合并操作的性能。要为MRv1或YARN启用此功能,请设置mapreduce.ifile.readahead 为 true(默认)。
        要进一步调整性能,请调整值mapreduce.ifile.readahead.bytes。默认值为4MB。

     4.MapReduce配置的最佳实践
        下面描述的配置设置可以减少MapReduce执行中的固有延迟。设置这些值在mapred-site.xml中。
        1.任务完成后立即发送心跳
          设置 mapreduce.tasktracker.outofband.heartbeat 为 true,使TaskTracker在任务完成时发送带外心跳以减少延迟。默认值为 false:
            <property>
                    <name>mapreduce.tasktracker.outofband.heartbeat</name>
                    <value>true</value>
            </property>

        2.减少单节点系统上JobClient状态报告的间隔
            该 jobclient.progress.monitor.poll.interval 的 property定义JobClient向控制台报告状态并检查作业完成的间隔(以毫秒为单位)。
            默认值为1000毫秒; 您可能希望将此值设置为较低的值,以使测试在单节点群集上运行得更快。
            在大型生产群集上调整此值可能会导致不必要的客户端 - 服务器流量。
            <property>
                    <name>jobclient.progress.monitor.poll.interval</name>
                    <value>10</value>
            </property>

        3.调整JobTracker心跳间隔
            将TaskTracker-to-JobTracker心跳的最小间隔调整为较小的值可以提高小集群上的MapReduce性能。
            <property>
                    <name>mapreduce.jobtracker.heartbeat.interval.min</name>
                    <value>10</value>
            </property>

        4.立即启动MapReduce JVM
            该 mapred.reduce.slowstart.completed.maps 的property指定在调度任何Reduce任务之前必须完成的作业中Map任务的比例。
            对于需要快速周转的小型作业,将此值设置为0可以提高性能; 较大的值(高达50%)可能适合较大的工作。
            <property>
                    <name>mapred.reduce.slowstart.completed.maps</name>
                    <value>0</value>
            </property>

    5.工作提示和最佳实践
        1.使用分布式缓存来传输作业 JAR 而不是使用JobConf(Class)构造函数 和 JobConf.setJar()方法 和 JobConf.setJarByClas()方法。
        2.要将JAR添加到类路径,请使用 -libjars jar1,jar2。这会将本地JAR文件复制到HDFS并使用分布式缓存机制来确保它们在任务节点上可用并添加到任务类路径中。
        3.这个的优点,结束了 JobConf.setJar,如果JAR位于任务节点上,如果来自同一作业的第二个任务在该节点上运行,则不需要再次复制,
          但仍需要将其从启动机器复制到HDFS。
        4.注意:-libjars仅当MapReduce驱动程序使用ToolRunner时才有效。如果没有,则需要使用DistributedCache API(Cloudera不建议这样做)。
        5.更改作业上的日志记录级别(MRv1)
            1.您可以更改单个作业的日志记录级别。您可以通过在作业配置中设置以下属性来完成此操作(JobConf):
                mapreduce.map.log.level
                mapreduce.reduce.log.level
              有效值是NONE, INFO, WARN, DEBUG, TRACE, and ALL
            2.例:
                JobConf conf = new JobConf();
                ...
                conf.set(“mapreduce.map.log.level”,“DEBUG”);
                conf.set(“mapreduce.reduce.log.level”,“TRACE”);
                ...

    6.减少储备空间
        默认情况下 EXT3 和 EXT4 文件系统保留5%的空间供root用户使用。这个保留空间算作 非DFS已使用。
        要查看保留空间,请使用tune2fs 命令:
            # tune2fs -l /dev/sde1 | egrep "Block size:|Reserved block count"
            Reserved block count:  36628312
            Block size:            4096
        翻译为:
            #tune2fs -l / dev / sde1 | egrep“块大小:|预留块数”
            保留块数:36628312
            块大小:4096

        保留块计数是 EXT3/EXT4保留的文件系统块。块大小是以字节为单位的大小。在此示例中,此文件系统上保留了150 GB(139.72千兆字节)。
        Cloudera建议将DataNode卷的root用户块预留从5%减少到1%。
        将预留空间设置为1%,使用 tune2fs 命令:# tune2fs -m 1 /dev/sde1