在 Linux 环境下对 HDFS(Hadoop Distributed File System) 进行性能调优,通常可以从 硬件、操作系统、HDFS 参数、MapReduce/YARN、读写模式 等多个层面入手。下面按“实战常用 + 关键点”的方式给你一份较系统的调优指南。
HDFS 的 DataNode 通常建议:
noatime,nodiratime,data=writeback,barrier=0
示例:
/dev/sdb /data1 ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 0
⚠️ barrier=0 有数据安全风险,仅在多副本 + 断电概率低环境使用
查看当前调度器:
cat /sys/block/sdX/queue/scheduler
建议:
修改(临时):
echo deadline > /sys/block/sdb/queue/scheduler
ulimit -n 65536
ulimit -u 65536
永久配置(/etc/security/limits.conf):
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
net.core.somaxconn = 4096
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
生效:
sysctl -p
默认 128MB,大文件场景建议:
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
✅ 适合:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
性能 vs 安全:
<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>
大带宽网络可提高到 128KB~256KB
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
经验公式:
handler.count ≈ 20 * log2(Cluster Size)
hadoop-env.sh:
export HADOOP_NAMENODE_OPTS="-Xmx8g -Xms8g"
NameNode 内存经验:
hdfs oiv 定期分析元数据-Dmapreduce.job.maps=200
-Dmapreduce.job.reduces=100
✅ 解决方案:
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
需配置 Unix Domain Socket
yarn.nodemanager.resource.memory-mb=64G
yarn.scheduler.maximum-allocation-mb=32G
避免:
iostat -x 1sar -dhdfs dfsadmin -report| 现象 | 原因 |
|---|---|
| 写慢 | 网络 / DN 磁盘 |
| 读慢 | 小文件 / 副本分布 |
| NN 卡 | 内存不足 / RPC 多 |
如果你愿意,可以告诉我:
我可以直接给你一套 可落地的参数模板。