简介
本文将介绍可以优化Hadoop性能的HDFS设置。注意,本文重点在提高HDFS性能,但是修改的部分设置有可能影响系统稳定性。请在了解清楚每个设置的作用后再修改。
使用推荐的加载选项
经测试,如下加载选项,可以优化Hadoop性能,推荐应用到所有磁盘。设置完毕(如修改/etc/fstab)后,不要忘了重新加载对应文件系统或者重启系统使修改生效。
使用如下加载设置:
ext4 —> "inode_readahead_blks=128","data=writeback","noatime","nodev"
xfs —> "noatime"
修改HDFS块(block)大小
可以提高NameNode性能和任务执行效率
确保块大小('hdfs-site.xml' 中的'dfs.blocksize'项) 在推荐范围内,即 134217728到1073741824 (不含).
使用HDFS短路读取(Short Circuit Reads)
在HDFS中,读取通常通过DataNode。 因此,当客户端请求DataNode读取文件时,DataNode从磁盘读取该文件,并通过TCP套接字将数据发送到客户端。 所谓的“短路”读取绕过DataNode,允许客户端直接读取文件。 显然,这仅在客户端与数据位于同一位置的情况下是可能的。 短路读数为许多应用提供了实质性的性能提升。
要配置短路本地读取,您需要启用libhadoop.so (用dfs.domain.socket.path配置)
在hdfs-site.xml中:
dfs.client.read.shortcircuit=true
dfs.domain.socket.path=/var/lib/hadoop-hdfs/dn_socket
文件大小不要小于块(block)大小
块平均大小应大于推荐值,67108864 MB。否则会增大NameNode的处理压力,导致堆/垃圾回收出现问题,降低数据储存处理效率。
将块大小设置大于 67108864 MB
Also, use one or more of the following techniques to consolidate smaller files :
同时下列方法可以减少小文件:
- Hive/BBase 压缩(compaction)
- 手工合并小文件
- 使用HAR打包小文件
优化DataNode JVM设置
优化JVM可以明显提高DataNode的性能。
如下例:
-Djava.net.preferIPv4Stack=true,
-XX:ParallelGCThreads=8,
-XX:+UseConcMarkSweepGC,
-Xloggc:*,
-verbose:gc,
-XX:+PrintGCDetails,
-XX:+PrintGCTimeStamps,
-XX:+PrintGCDateStamps
同时:
-Xms 应该与 -Xmx相同
New generation size 应为 JVM 总数的 ⅛ .
避免使用过期的DataNode
过期的DataNode指的是在预设的时间段内接收不到其heartbeat的DataNode,这些DataNode可能已经失效或忙碌。应避免使用这部分DataNode。
在hdfs-site.xml中:
dfs.namenode.avoid.read.stale.datanode=true
dfs.namenode.avoid.write.stale.datanode=true
使用基于JNI的组查找(JNI-based group lookup)
Hadoop可植入界面允许使用多种方案进行组成员查找,但是基于JNI的性能更高,
在hdfs-site.xml中:
hadoop.security.group.mapping=org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback