一、Linux 平台(文件系统)
      (1) noatime 和 nodiratime 属性 (/etc/fstab 文件)
文件挂载时设置这两个属性可以明显提高性能。。默认情况下,Linux ext2/ext3 文件系统在文件被访问、创建、修改时会记录下文件的时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间。如果系统运行时要访问大量文件,关闭这些操作,可提升文件系统的性能。Linux 提供了 noatime 这个参数来禁止记录最近一次访问时间戳。
      (2) readahead buffer
调整linux文件系统中预读缓冲区地大小,可以明显提高顺序读文件的性能。默认buffer大小为256 sectors,可以增大为1024或者2408 sectors(注意,并不是越大越好)。可使用blockdev命令进行调整

(3) 避免RAID和LVM操作
避免在NodeManager和DataNode的机器上执行RAID和LVM操作,这通常会降低性能。

(4)Linux 最大文件数 (/etc/security/limits.conf)
建议增大这个数,因为当hadoop运行起来之后,较小的文件数会造成hadoop运行失败

二、Hadoop 部分
HDFS 部分 (hdfs-site.xml)
     (1)dfs.namenode.handler.count
namenode 中用于处理RPC 的线程数,默认是 10, 较大集群可以增大,如32、 64 或 128

(2)dfs.datanode.handler.count
datanode上用于处理RPC的线程数。默认为10,较大集群,可适当调大些,比如32。需要注意的是,每添加一个线程,需要的内存增加。

(3) dfs.datanode.max.transfer.threads (1.0 的名字 dfs.datanode.max.xcievers)
指定datanode 用于 数据传入、传出时最大的线程个数 。 默认 4096 。 大集群建议8192或更大

(4) dfs.client.file-block-storage-locations.num-threads
在调用DistributedFileSystem#getFileBlockStorageLocations()的并发RPC的线程数, 如果有很多程序并发调用这个接口,建议增大。默认:10

(5) dfs.datanode.du.reserved
每个磁盘(volume)的保留空间,字节。要注意留足够的空间给非HDFS文件使用。建议保留磁盘容量的5%或者50G以上,
如果平台上需要很多本地临时空间,建议增大这个值

(6)dfs.client.read.shortcircuit
本地读策略,如果块在本地将直接读取数据块,不再与datanode 交互。 建议打开

(7) dfs.data.dir
配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。运行 Linux sysstat包下的iostat -dx 5命令可以让每个磁盘都显示它的利用率。

(8) HADOOP_OPTS 启动参数(hadoop-env.sh)
打开HDFS的并行GC功能,同时调大JVM的堆内存大小
建议配置-XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:SoftRefLRUPolicyMSPerMB=0 $HADOOP_OPTS -Djava.net.preferIPv4Stack=true

YARN 部分 (yarn-site.xml)
      (1) yarn.nodemanager.local-dirs
本地文件存储目录,列表。一个应用的本地文件目录定位方式:${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}。每个container的工作目录,是此目录的子目录,目录名是container_${contid}
配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。运行 Linux sysstat包下的iostat -dx 5命令可以让每个磁盘都显示它的利用率。
非常重要,建议配置多个磁盘,平衡IO。

(2) yarn.nodemanager.vmem-pmem-ratio
在设置container的内存限制时,虚拟内存到物理内存的比率。Container申请的内存如果超过此物理内存,可以以此比率获取虚拟内存用于满足需求。虚拟地址的是物理地址的倍数上限。建议设置的大点,例如:4.1,8.1,此虚拟内存并非内存,而是占用的虚拟地址。

(3) yarn.nodemanager.delete.debug-delay-sec
秒,一个app完成后,NM删除服务将删除app的本地文件目录和日志目录。为了诊断问题,把这个选项设置成足够大的值(例如,设置为10分钟),可以继续访问这些目录。设置此选项,需要重启NM。Yarn应用的工作目录根路径是yarn.nodemanager.local-dirs,Yarn应用日志目录的根路径是yarn.nodemanager.log-dirs。

(4) yarn.log-aggregation-enable
是否允许日志汇聚功能。建议开启

(5) yarn.log-aggregation.retain-seconds = -1
保存汇聚日志时间,秒,超过会删除,-1表示不删除。 注意,设置的过小,将导致NN垃圾碎片。建议3-7天 = 7 * 86400 = 604800

(6) yarn.nodemanager.log.retain-seconds=10800
保留用户日志的时间,秒。在日志汇聚功能关闭时生效。根据日志量决定保留时间,建议7天

(7) yarn.nodemanager.remote-app-log-dir=/tmp/logs
汇聚日志的地方,目录路径,HDFS系统。

(8) yarn.resourcemanager.client.thread-count=50
RM用来处理客户端请求的线程数, 客户端很多时建议增加

(9) yarn.resourcemanager.scheduler.client.thread-count=50
调度器用于处理请求的线程数, 跑很多小作业并且处理非常快时建议增加

(10) yarn.resourcemanager.resource-tracker.client.thread-count=50
处理资源跟踪调用的线程数

(12) yarn.nodemanager.container-manager.thread-count=20
用于container管理的线程数, 一般不用修改

(13)yarn.nodemanager.disk-health-checker.min-healthy-disks=0.25
周期性检查 yarn.nodemanager.local-dirs ,如果可用容量低于25% 则将该节点标记为不健康状态, 如果单盘容量很大建议修改

(14)yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb
一块磁盘最少保证剩余空间大小,当某块磁盘剩余空间低于该值时,将不再使用该盘,默认是0,表示0MB。

(15)yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage
一块磁盘的最高使用率,当一块磁盘的使用率超过该值时,则认为该盘为坏盘,不再使用该盘,默认是100,表示100%,可以适当调低;

(16) YARN 的启动参数 YARN_NODEMAANGER_OPTS 和 YARN_RESOURCEMANAGER_OPTS(yarn-env.sh)
建议和namenode一样,打开并行GC功能,根据节点数和并行度增加堆大小

(17) yarn.nodemanager.resource.memory-mb=8192
NM上可以用于container申请的物理内存大小,MB

(18)yarn.scheduler.minimum-allocation-mb=1024
每个container 向ResourceManager请求内存的 最小资源分配单位,如果Container 的请求小于这个值,分配这个最小单位。

(19) yarn.scheduler.maximum-allocation-mb=8192
每个container 向ResourceManager请求内存的 最大资源分配单位,如果Container 的请求大于这个值,分配这个上限值。一般和yarn.nodemanager.resource.memory-mb 配置一样大

(20) yarn.scheduler.minimum-allocation-vcores=1
每个container 向ResourceManager请求VCore的 最小资源分配单位,如果Container 的请求小于这个值,分配这个最小单位。

(21) yarn.scheduler.maximum-allocation-vcores=32
每个container 向ResourceManager请求VCore的 最大资源分配单位,如果Container 的请求大于这个值,分配这个上限值。一般和yarn.nodemanager.resource.cpu-vcores 配置一样大

(22) yarn.nodemanager.resource.cpu-vcores=8
NM上可以用于container申请的VCore个数,建议跟物理核数相同

MapRedcue 部分 (mapred-site.xml)
(1) yarn.app.mapreduce.am.env=null
用户为MR AM添加环境变量。

(2) yarn.app.mapreduce.am.command-opts
MR AM的Java opts。如下符号会被替换:
@taskid@ 被替换成当前的TaskID。其它出现的’@’不会改变。例如,为了让gc日志能够按task打印存储在/tmp目录,可以设置’value’为:-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc如果hadoop本地库可以使用,使用-Djava.library.path参数可能造成程序的此功能无效。这个值应该被替换,设置在MR的JVM环境中LD_LIBRARY_PATH变量中,使用 mapreduce.map.env和mapreduce.reduce.env配置项。
(3) yarn.app.mapreduce.am.job.task.listener.thread-count=30
MR AM处理RPC调用的线程数

(4) yarn.app.mapreduce.am.scheduler.heartbeat.interval-ms=1000
MR AM发送心跳到RM的时间间隔,毫秒

(5) mapreduce.cluster.local.dir
mapreduce 的本地文件存储目录,建议配置多个目录分散IO。

(6) mapreduce.map.java.opts
map 子进程的JVM启动参数 如 -Xmx1024m

(7) mapreduce.reduce.java.opts
redcue 子进程的JVM 启动参数 如-Xmx1024m

(8)mapreduce.tasktracker.http.threads=40
map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。

(9)mapreduce.jobtracker.handler.count=10
对于JobTracker服务器线程数。这应该是大约4%的TaskTracker节点数。

(10)mapreduce.map.cpu.vcores=1
每个map使用的vcore个数, 配置时可以参考单节点核数和期望的并行数据进行计算

(11) mapreduce.map.memory.mb=1024
每个map使用的内存大小, 配置时可以参考单个NodeManager提供的可供计算内存和期望的并行数进行计算

(12)mapreduce.reduce.cpu.vcores=1
每个redcue使用的vcore个数,配置时可以参考单节点核数和期望的并行数据进行计算

(13) mapreduce.reduce.memory.mb=1024
每个reduce使用的内存大小, 配置时可以参考单个NodeManager提供的可供计算内存和期望的并行数进行计算
举例: 单节点NodeManager内存为48G,24个核,期望并行为12.
mapreduce.map.cpu.vcores=24/12=2
mapreduce.map.memory.mb=48/12=4G
建议reduce Container的资源是Map资源的两倍
mapreduce.reduce.cpu.vcores=mapreduce.map.cpu.vcores*2
mapreduce.reduce.memory.mb=mapreduce.map.memory.mb*2