下面从 Linux 系统层 + HDFS 参数层 两个维度,系统性地讲一下 HDFS 调优 的常见做法,适合生产环境参考。
HDFS 会打开大量文件,必须调大。
# 查看
ulimit -n
# 修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
DataNode / NameNode 用户都要生效。
swap 会导致 HDFS 延迟飙升。
swapoff -a
并在 /etc/fstab 中注释 swap 行。
建议使用 deadline 或 noop
# 查看
cat /sys/block/sda/queue/scheduler
# 修改(临时)
echo deadline > /sys/block/sda/queue/scheduler
挂载参数建议:
noatime,nodiratime
例如:
mount -o noatime,nodiratime /dev/sdb /data
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
hadoop-env.sh
export HADOOP_NAMENODE_OPTS="-Xmx8g -Xms8g"
经验值:
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
适用场景:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
调优建议:
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
(老版本叫 xcievers)
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
HDFS 最怕小文件:
解决方案:
大文件场景(256MB block)
dfs.blocksize=268435456
dfs.replication=3
dfs.datanode.max.transfer.threads=8192
dfs.namenode.handler.count=100
如果你愿意,可以告诉我:
我可以直接给你一套 可落地的配置模板。