在 CentOS 上对 HDFS(Hadoop Distributed File System) 进行调优,通常从 操作系统层、HDFS 参数配置、JVM、磁盘与网络 几个方面入手。下面给你一个较系统、可落地的调优指南。
HDFS(尤其是 NameNode、DataNode)会打开大量文件。
# 查看当前限制
ulimit -n
ulimit -u
修改 /etc/security/limits.conf:
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
swap 会导致 GC 停顿和性能剧烈下降。
# 临时
swapoff -a
# 永久(注释 /etc/fstab 中 swap 行)
vim /etc/fstab
对 HDD 推荐使用 deadline,SSD 推荐 noop 或 mq-deadline
# 查看
cat /sys/block/sda/queue/scheduler
# 临时修改
echo deadline > /sys/block/sda/queue/scheduler
推荐使用 ext4 或 xfs
mount -o noatime,nodiratime /dev/sdb /data
noatime 可减少元数据写入。
编辑 /etc/sysctl.conf:
net.core.somaxconn = 32768
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_tw_reuse = 1
sysctl -p
<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.blocksize</name>
<value>256m</value>
</property>
默认 128MB,大文件可提升到 256MB / 512MB。
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
冷数据可降低副本数以节省空间。
多磁盘分散 IO:
<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/dfs,/data2/dfs,/data3/dfs</value>
</property>
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g -XX:+UseG1GC"
export HADOOP_DATANODE_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC"
推荐使用 G1GC(JDK8+)
<property>
<name>dfs.client-write-packet-size</name>
<value>65536</value>
</property>
<property>
<name>dfs.client.max.block.acquire.failures</name>
<value>10</value>
</property>
<property>
<name>dfs.read.ahead.length</name>
<value>4m</value>
</property>
适用于顺序读场景。
| 问题 | 原因 | 解决 |
|---|---|---|
| NameNode 卡顿 | GC 或打开文件过多 | 调大内存 + nofile |
| DataNode 掉线 | 网络或 disk IO | TCP 调优 + 多磁盘 |
| 写入慢 | 副本同步 | 合理副本数 |
| 磁盘满 | 单盘 | 多目录 |
iostat -x 1jstat -gcutil <pid> 1000如果你愿意,可以告诉我:
我可以给你 更精准的调优参数模板。