简介

本文将介绍可以优化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