在 Linux 环境下对 HDFS(Hadoop Distributed File System) 进行配置调优,通常需要从 操作系统层、HDFS 参数层、JVM 层、硬件与架构层 多个维度入手。下面按实战优先级给你一份较系统的调优指南。
HDFS 大量使用文件句柄,默认值通常太小。
# 查看
ulimit -n
# 修改(/etc/security/limits.conf)
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
swapoff -a
# 或永久
sed -i '/swap/s/^/#/' /etc/fstab
# 查看
cat /sys/block/sd*/queue/scheduler
# 设置(示例)
echo noop > /sys/block/sda/queue/scheduler
# /etc/sysctl.conf
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
sysctl -p
大文件场景:
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
小文件多:
<property>
<name>dfs.blocksize</name>
<value>67108864</value> <!-- 64MB -->
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>40</value> <!-- 每 1GB 堆内存约 20 -->
</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.replication</name>
<value>3</value>
</property>
性能敏感且数据可重建:可设为 2
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g"
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.client.write.packet.size</name>
<value>131072</value> <!-- 128KB -->
</property>
减少网络开销,强烈推荐
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
<property>
<name>dfs.namenode.fs-limits.max-directory-items</name>
<value>1048576</value>
</property>
hdfs dfsadmin -report| 项目 | 建议值 |
|---|---|
| 块大小 | 256MB |
| 副本 | 3 |
| NameNode 内存 | 8–16GB |
| DataNode 线程 | 8192 |
| 短路读 | 开启 |
| Linux nofile | 65536 |
如果你愿意,可以告诉我:
我可以直接给你一套可落地的配置文件示例。