hdfs+yarn 参数调优

1.系统参数调整

中文名称 英文名称 默认值 推荐值或推荐策略 修改命令 作用 备注
socket的监听队列最大值 net.core.somaxconn 128 1024或更大 echo 1024 >/proc/sys/net/core/somaxconn 增大打开文件数据和网络连接上限,调整内核参数net.core.somaxconn,提高读写速度和网络带宽使用率 如果是hadoop使用,需重启hadoop才能有效,并且要配合hadoop集群参数ipc.server.listen.queue.size使用才有效
读取不更新文件atime属性 noatime   noatime vi /etc/fstab
#/dev/data1 / ext4 defaults,noatime 0 0
mount -o remount /dev/data1
当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。  
磁盘预读缓存区大小 blockdev --getra /dev/sda 256 2048或更大 blockdev --setra 2048 /dev/sda 预读可以减少磁盘寻道次数和I/O等待时间 执行命令只对一块磁盘有效,需执行多次,且重启系统后失效
系统IO调度器 IO Scheduler cfq deadline echo deadline > /sys/block/sda/queue/scheduler DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:
FIFO(Read) > FIFO(Write) > CFQ
查看命令:
cat /sys/block/sda/queue/scheduler
epoll文件描述符上限 fs.epoll.max_user_watches 27054714 270547140 echo /proc/sys/fs/epoll/max_user_watches 单个用户使用epoll进行watch的文件描述符上限。 note(dirlt):对于服务器应该特别有用,可以限制内存使用量 查看命令:
sysctl -a |grep epoll
设置openfile ulimit -a |grep 'open files' 1024 65535或更大 即时生效:
ulimit -n 65535
永久生效:
在/ect/security/limits.conf中添加
* - nofile 65535
* - nproc 65535 
打开文件描述上限太小,会出现打不开文件的问题  
系统交换分区 swap 开启 关闭 swapoff -a 如果进程内存不足,系统会将内存中的部分数据暂时写入磁盘,当需要时再将磁盘上的数据动态换置到内存中,这样会降低进程执行效率 重新挂载swap分区:
swapon -a

2.hdfs的参数

数据块的副本数 dfs.replication 3 2 页面修改 减少副本块可以节约存储空间  
SequenceFile I/O 缓存区大小  io.file.buffer.size   131072(可以更大) core-site.xml 的群集范围高级配置代码段(安全阀) hadoop访问文件的IO操作都需要通过代码库,在很多情况下io.file.buffer.size都被用来设置缓存的大小。不论是对硬盘或者是网络操作来讲,较大的缓存都可以提供更高的数据传输,但这也就意味着更大的内存消耗和延迟。这个参数要设置为系统页面大小的倍数,以byte为单位。  
.Trash目录下文件被永久删除前保留的时间 fs.trash.interval   1440(24小时) core-site.xml 的群集范围高级配置代码段(安全阀)    
垃圾回收的检查间隔 fs.trash.checkpoint.interval   1440 core-site.xml 的群集范围高级配置代码段(安全阀)    
是否启动Hadoop的本地库 io.native.lib.available   true core-site.xml 的群集范围高级配置代码段(安全阀) 本地库可以加快基本操作,例如IO,压缩等。  
NameNode 处理程序计数 dfs.namenode.handler.count 40 400 页面修改 设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanodes 沟通。当 datanodes 数量太多时会发現很容易出現 RPC timeout,解決方法是提升网络速度或提高这个值,但要注意的是 thread 数量多也表示 namenode 消耗的内存也随着增加。 扩展性相关参数
NameNode 服务处理程序计数 dfs.namenode.service.handler.count   400 页面修改    
NameNode的java堆栈大小 NameNode Java heap size   90G 页面修改    
DataNode的java堆栈大小 DataNode maximum Java heap size   16G 页面修改    
DataNode 处理程序计数 dfs.datanode.handler.count 3 50      
提前读取的字节数 dfs.datanode.readahead.bytes 4M 64M 页面修改 读取块文件时,DataNode 可以使用 posix_fadvise 系统呼叫将数据显式放入操作系统缓冲区缓存中当前读取器位置之前。这样可以提高性能,尤其是在磁盘高度占用的情况下。该配置指定 DataNode 尝试提前读取的位置比当前读取位置提前的字节数。  
ipc服务监听队列长度 ipc.server.listen.queue.size 1024 与系统参数net.core.somaxconn保持一致 core-site.xml 的群集范围高级配置代码段(安全阀) 增大打开文件数据和网络连接上限,提高hadoop集群读写速度和网络带宽使用率  

3.yarn的参数

日志聚合保留期 yarn.log-aggregation.retain-seconds 7 2 页面修改 删除聚合日志前要保留它们多久  
Mapreduce 提交复制 mapreduce.client.submit.file.replication 10 1 页面修改 mapreduce任务数据的副本数,默认是10,比普通HDFS文件的默认幅本数大很多,可能也是考虑到把输入数据放到更多的DN上,尽可能实现本地数据计算,但会增大数据量,更改为1个副本  
MapReduce产生的中间数据存放目录 mapred.local.dir   /data/cache1/dfs/mapred/local,/data/cache2/dfs/mapred/local,/data/cache3/dfs/mapred/local,/data/cache4/dfs/mapred/local 页面修改    
Map 任务 Java 选项库 mapreduce.map.java.opts   -Xmx1024M 页面修改 jvm启动时的参数,只对java,scala程序有效(相比mapreduce.map.memory.mb要小一点是因为java程序占用内存较少  
Map 任务内存 mapreduce.map.memory.mb   1.5G 页面修改 map任务申请的内存  
Reduce 任务 Java 选项库 mapreduce.reduce.java.opts   -Xmx2560M 页面修改 同map  
Reduce 任务内存 mapreduce.reduce.memory.mb   3G 页面修改 同map  
I/O 排序因子 mapreduce.task.io.sort.factor 10 100 页面修改 排序文件时要合并的流的数量。也就是说,在 reducer 端合并排序期间要使用的排序头数量。此设置决定打开文件句柄数。并行合并更多文件可减少合并排序迭代次数并通过消除磁盘 I/O 提高运行时间。注意:并行合并更多文件会使用更多的内存。如 'io.sort.factor' 设置太高或最大 JVM 堆栈设置太低,会产生过多地垃圾回收。Hadoop 默认值为 10,建议使用更高值。  
I/O 排序内存缓冲 (MiB) mapreduce.task.io.sort.mb   512M 页面修改 当排序文件时要使用的内存缓冲总量。注意:此内存由 JVM 堆栈大小产生(也就是:总用户 JVM 堆栈 - 这些内存 = 总用户可用堆栈空间)。注意:Cloudera 的默认值不同于 Hadoop 的默认值;默认情况下,Cloudera 使用更大的缓冲,因为现代机器通常有更多的 RAM。  
洗牌期间并行传输的默认数量 mapreduce.reduce.shuffle.parallelcopies 10 50 页面修改 复制(洗牌)阶段期间 reduce 运行的并行传输的默认数量。此数量应在(节点数 * 每节点 map 时隙数)的平方根与节点数 * 每节点 map 时隙数/2 之间  
JobHistory Server 的 Java 堆栈大小(字节)     10G 页面修改    
ResourceManager 的 Java 堆栈大小(字节)     10G 页面修改    
容器内存 yarn.nodemanager.resource.memory-mb   20G 页面修改 每个节点分配给yarn跑任务的内存  
容器虚拟 CPU 内核 yarn.nodemanager.resource.cpu-vcores   12 页面修改 每个节点分配给yarn跑任务的cpu  
root队列的所有子队列 yarn.scheduler.capacity.root.queues   default 容量调度程序配置高级配置代码段(安全阀) 目前只配置了default,同时跑的任务多了可以配置不同队列,每个队列占用的的资源可以在这里调控  
队列的资源容量占比(百分比)。 yarn.scheduler.capacity.root.capacity   100 容量调度程序配置高级配置代码段(安全阀) 系统繁忙时,每个队列都应该得到设置的量的资源;当系统空闲时,该队列的资源则可以被其他的队列使用。同一层的所有队列加起来必须是100%。 参考http://www.360doc.com/content/14/0117/15/834950_345972005.shtml,配置集群同时运行的任务数量
  yarn.nodemanager.aux-services   mapreduce_shuffle yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) 跑mapreduce的必要参数  
  yarn.nodemanager.aux-services.mapreduce_shuffle.class   org.apache.hadoop.mapred.ShuffleHandler yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) 跑mapreduce的必要参数  
  yarn.log-aggregation.retain-check-interval-seconds   86400 yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) 多长时间检查一次日志,并将满足条件的删除(yarn程序的日志可以保存到hdfs,设置存储期限)  
  yarn.nodemanager.remote-app-log-dir   /data/logs/hadoop-yarn/apps yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) yarn执行程序的日志存放目录  
JobTracker可以启动的线程数 mapreduce.jobtracker.handler.count 10 100 页面修改 JobTracker可以启动的线程数 暂时不考虑增大,任务增多的时候需要调整此参数
压缩 Map 输出  mapreduce.map.output.compress FALSE TRUE 页面修改 如已启用,将在将 map 输出发送到网络前对其进行压缩。将是生成的客户端配置的一部分。  
MapReduce Map 输出的压缩编码解码器 mapreduce.map.output.compress.codec org.apache.hadoop.io.compress.DefaultCodec org.apache.hadoop.io.compress.SnappyCodec 页面修改 采用snappy压缩  
默认启动的reduce数 mapreduce.job.reduces 10 0.95 or 1.75 multiplied by ( * )
本次测试使用25
页面修改 提升reduce并发度 reduce数量最好自己设置
单个shuffle可以占用Java 堆栈的百分比上限 mapreduce.reduce.shuffle.memory.limit.percent 0.25 0.45 yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) 每个fetch取到的输出的大小能够占的内存比的大小  
触发merge的内存百分比 mapreduce.reduce.shuffle.merge.percent 0.66 0.9 yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) 在shuffle阶段期间用于触发merge的Java堆栈百分比  
传输的并行线程数 mapreduce.tasktracker.http.threads 40 100 yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数  
JobTracker MetaInfo Maxsize  mapreduce.job.split.metainfo.maxsize 10000000 -1 页面修改 分割 metainfo 文件的大小上限。JobTracker 将不会尝试读取大于已配置值的分割 metainfo 文件。 大量小文件时有效
最大shuffle连接  mapreduce.shuffle.max.connections 0 暂不调整 页面修改    
客户端线程计数 yarn.resourcemanager.client.thread-count 50 100 页面修改 用于处理应用程序管理请求的线程数量。 优先级低
扩展性相关参数
调度程序线程计数 yarn.resourcemanager.scheduler.client.thread-count 50 100 页面修改 用于通过调度器接口处理请求的线程数量。 优先级低
扩展性相关参数
管理客户端线程计数  yarn.resourcemanager.admin.client.thread-count 1 10 页面修改 用于处理 ResourceManager 管理接口的线程数量。 优先级低
扩展性相关参数
容器管理器线程计数  yarn.nodemanager.container-manager.thread-count 20 建议调整为(no. of maximum containers per node)的整数倍
本次调整为50
页面修改 容器管理器使用的线程数,主要用于AM与NM通信。 优先级低
清理线程计数 yarn.nodemanager.delete.thread-count 4 16 页面修改 用于清理临时结果的线程数。 优先级低

  

你可能感兴趣的:(hdfs+yarn 参数调优)