在 CentOS 下对 HDFS(Hadoop Distributed File System) 进行调优,通常从 操作系统层面、HDFS 参数配置、JVM、磁盘与网络、集群规模与业务场景 几个维度来做。下面给你一份实用向的 HDFS 调优指南,适合生产环境参考。
HDFS 会打开大量文件,默认太小会直接导致故障。
# 查看
ulimit -n
# 修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
swapoff -a
# 永久禁用:注释 /etc/fstab 中 swap 行
推荐使用 deadline 或 noop
# 查看
cat /sys/block/sda/queue/scheduler
# 临时修改
echo deadline > /sys/block/sda/queue/scheduler
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
sysctl -p
大文件场景(日志、离线计算)
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
小文件多场景
<value>64m 或 128m</value>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>40</value>
</property>
经验值:
handler.count ≈ 20 * log2(集群节点数)
<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.heartbeat.interval</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g -XX:+UseG1GC"
export HADOOP_DATANODE_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC"
建议:
<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/dfs,/data2/dfs,/data3/dfs</value>
</property>
defaults,noatime,nodiratime
<property>
<name>dfs.client.write.packetsize</name>
<value>65536</value>
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
hdfs dfsadmin -report| 场景 | 建议 |
|---|---|
| 离线计算 | 大 block + G1GC |
| 实时写入 | 短心跳 + 短路读 |
| 小文件多 | 合并 + 降低副本 |
| 高并发 | 增加 handler |
如果你愿意,可以告诉我:
我可以直接给你一份可复制的配置文件模板。