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 | 60 | 页面修改 | 设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanodes 沟通。当 datanodes 数量太多时会发現很容易出現 RPC timeout,解決方法是提升网络速度或提高这个值,但要注意的是 thread 数量多也表示 namenode 消耗的内存也随着增加。 | 扩展性相关参数 |
NameNode 服务处理程序计数 | dfs.namenode.service.handler.count | 100 | 页面修改 | |||
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集群读写速度和网络带宽使用率 | |
最大传输线程数 | dfs.datanode.max.xcievers | 4096 | 8192 | 页面修改 |
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.4 | yarn-site.xml 的 YARN 服务高级配置代码段(安全阀) | 每个fetch取到的输出的大小能够占的内存比的大小 | |
触发merge的内存百分比 | mapreduce.reduce.shuffle.merge.percent | 0.66 | 0.8 | 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 | 暂不调整 | 页面修改 | 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)的整数倍 本次不调整 |
页面修改 | 容器管理器使用的线程数,主要用于AM与NM通信。 | 优先级低 |
清理线程计数 | yarn.nodemanager.delete.thread-count | 4 | 8 | 页面修改 | 用于清理临时结果的线程数。 | 优先级低 |
export HBASE_HEAPSIZE=90G(分配给hbase的内存)
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx20g -Xms20g -Xmn8g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx90g -Xms90g -Xmn30g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
-XX:G1MixedGCCountTarget=16 参考http://blog.csdn.net/qq_19917081/article/details/54585099,测试的时候可以打印gc日志,观察效果,稳定后不需要打印日志,打印日志配置(
)
hbase.regionserver.global.memstore.upperLimit:默认值0.4 ,RS所有memstore占用内存在总内存中的upper比例,当达到该值,则会从整个RS中找出最需要flush的region进行flush,直到总内存比例降至该数限制以下,并且在降至限制比例以下前将阻塞所有的写memstore的操作,在以写为主的集群中,可以调大该配置项,不建议太大,因为block cache和memstore cache的总大小不会超过0.8,而且不建议这两个cache的大小总和达到或者接近0.8,避免OOM,在偏向写的业务时,可配置为0.45,memstore.lowerLimit保持0.35不变,在偏向读的业务中,可调低为0.35,同时hbase.regionserver.global.memstore.lowerLimit调低为0.3,或者再向下0.05个点,不能太低,除非只有很小的写入操作,如果是兼顾读写,则采用默认值即可
file.block.cache.size:RS的block cache的内存大小限制,默认值0.25,在偏向读的业务中,可以适当调大该值,具体配置时需试hbase集群服务的业务特征,结合memstore的内存占比进行综合考虑。
hbase.hregion.max.filesize 拆分大小,建议设置大些 10g或者更大
hbase.hregion.majorcompaction:(建议设置为0,写脚本每天凌晨合并,因为major时会触发阻塞,严重影响写入查询)配置major合并的间隔时间,默认为1天,可设置为0,禁止自动的major合并,可手动或者通过脚本定期进行major合并,有两种compact:minor和major,minor通常会把数个小的相邻的storeFile合并成一个大的storeFile,minor不会删除标示为删除的数据和过期的数据,major会删除需删除的数据,major合并之后,一个store只有一个storeFile文件,会对store的所有数据进行重写,有较大的性能消耗。
hbase.master.handler.count:80 master处理线程
hbase.regionserver.handler.count:150 regionserver 处理线程
hbase.hstore.blockingStoreFiles:20 定义storefile数量达到多少时block住update操作。设置过小会使影响系统吞吐率(使吞吐率不高)。建议将该值调大一些,(但也不应过大,经验值是20左右吧。太大的话会在系统压力很大时使storefile过多,compact一直无法完成,扫库或者数据读取的性能会受到影响)
hbase.hstore.compactionThreshold :5 启动compaction的文件数
hbase.regionserver.thread.compaction.small:2 增加执行compaction的线程数
echo "deadline" > /sys/block/sdb/queue/scheduler
禁用交换分区