在 Linux 环境下对 HDFS(Hadoop Distributed File System) 进行调优,通常可以从 操作系统参数、HDFS 参数、JVM 参数、硬件与网络 几个层面入手。下面按“常用且效果明显”的方式给你一个系统性的调优指南。
HDFS 会打开大量文件,必须调大。
# 查看
ulimit -n
# 临时修改
ulimit -n 65536
# 永久修改(/etc/security/limits.conf)
* soft nofile 65536
* hard nofile 65536
# TCP 优化
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 8192
# 端口与 TIME_WAIT
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 内存与交换
vm.swappiness = 10
vm.overcommit_memory = 1
应用:
sysctl -p
SSD 推荐 noop 或 deadline:
echo deadline > /sys/block/sda/queue/scheduler
大文件场景建议调大:
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
性能优先可降低为 2,可靠性优先保持 3
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
</property>
<property>
<name>dfs.client.write.packet.size</name>
<value>65536</value>
</property>
<property>
<name>dfs.socket.timeout</name>
<value>180000</value>
</property>
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g -XX:+UseG1GC"
export HADOOP_DATANODE_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC"
经验:
- NameNode:每 100 万文件 ≈ 1GB 内存
- 开启 G1GC 减少停顿
<property>
<name>mapreduce.fileoutputcommitter.algorithm.version</name>
<value>2</value>
</property>
✅ 多磁盘(JBOD > RAID)
✅ 万兆网卡
✅ 分离 NameNode 与 DataNode
✅ 避免 NameNode 使用高负载机器
| 问题 | 调优点 |
|---|---|
| NameNode 卡 | 加大 handler.count、内存 |
| 写入慢 | 增大 packet.size、网络 |
| 小文件多 | 合并文件 / HAR / HBase |
| DataNode 掉线 | 调大 socket.timeout |
| 磁盘 IO 高 | 多磁盘 + IO 调度 |
如果你愿意,我可以:
hdfs-site.xml只要告诉我你的集群情况即可。