在 Linux 上运行 HDFS(Hadoop Distributed File System) 时,调优通常分为 操作系统层、HDFS 参数层、JVM 层、硬件与网络层 四个维度。下面给出一套实用向的调优思路,适合生产环境参考。
HDFS 会打开大量文件,必须调大。
# 查看
ulimit -n
# 修改 /etc/security/limits.conf
hdfs soft nofile 65536
hdfs hard nofile 1048576
# 文件句柄
fs.file-max = 1000000
# TCP 优化
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 8192
# TCP 连接复用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 内存与交换
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
sysctl -p
根据文件类型调整:
<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>40</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
<property>
<name>dfs.client.write.packetsize</name>
<value>65536</value>
</property>
hadoop-env.sh
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g -XX:+UseG1GC"
经验:
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/dfs,/data2/dfs,/data3/dfs</value>
</property>
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>
ethtool -K eth0 tso off lro off
<property>
<name>net.topology.script.file.name</name>
<value>/etc/hadoop/rack-awareness.sh</value>
</property>
# HDFS 状态
hdfs dfsadmin -report
# 慢节点
hdfs dfsadmin -metasave /tmp/meta
# DataNode 日志
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-datanode.log
| 场景 | 建议 |
|---|---|
| 小文件多 | 合并 / HAR / HBase |
| 写密集 | 增大 handler、block size |
| 读密集 | 增加副本、缓存 |
| NameNode 压力大 | Federation |
如果你能提供:
我可以给你一套更精准的 HDFS 调优参数模板。