在 Linux 环境下对 HDFS(Hadoop Distributed File System) 进行性能调优,通常需要从 硬件、操作系统、HDFS 参数、MapReduce/YARN、数据布局 等多个层面入手。下面按实战角度系统梳理。
HDFS 对磁盘吞吐极度敏感。
# 查看磁盘调度策略
cat /sys/block/sdX/queue/scheduler
# 推荐使用 deadline 或 noop(SSD)
echo deadline > /sys/block/sdX/queue/scheduler
# 增大预读
blockdev --setra 4096 /dev/sdX
ulimit -n 65536
ulimit -u 65536
/etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
# 增大 TCP 缓冲区
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
sysctl -w vm.swappiness=0
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</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.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.client-write-packet-size</name>
<value>65536</value>
</property>
<property>
<name>dfs.datanode.sync.behind.writes</name>
<value>false</value>
</property>
libhadoop.so<property>
<name>dfs.client.cache.readahead</name>
<value>4194304</value>
</property>
yarn.scheduler.maximum-allocation-mb=65536
yarn.nodemanager.resource.memory-mb=128000
hdfs dfsadmin -report
hdfs balancer
iostat -x 1
sar -n DEV 1
高吞吐离线集群:
如果你能提供:
我可以给你一套 可直接用的参数模板。