在 CentOS 上限制 HDFS 的速度,通常并不是直接“限制 HDFS 本身”,而是限制 网络带宽、磁盘 IO 或 YARN/MapReduce 的资源使用。下面按常见场景给你系统性的做法。
HDFS 没有“限速参数”,但可以通过 限制 DataNode 的网络带宽 来实现。
Hadoop 通过 流量整形(Traffic Shaping) 来限制 DataNode 之间的数据传输速度。
hdfs-site.xml<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>10485760</value> <!-- 10 MB/s -->
</property>
单位:字节/秒
常见取值:
| 限速 | 值 |
|---|---|
| 5 MB/s | 5242880 |
| 10 MB/s | 10485760 |
| 20 MB/s | 20971520 |
✅ 适用于:
⚠️ 需要重启 DataNode 生效
如果是 跑 MR / Spark 任务时 HDFS 占用带宽太高:
# 限制 eth0 网卡带宽为 50Mbps
tc qdisc add dev eth0 root tbf rate 50mbit burst 32kbit latency 400ms
取消限制:
tc qdisc del dev eth0 root
✅ 适合:
ionice 限制 DataNode 磁盘 IOionice -c 2 -n 7 -p $(pgrep -f DataNode)
| 参数 | 说明 |
|---|---|
-c 2 |
最佳努力调度 |
-n 7 |
最低优先级 |
✅ 适合:
如果你是在 执行 HDFS Balancer 时想限速:
hdfs balancer -bandwidth 10485760
或者在 hdfs-site.xml 中设置(永久生效):
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
副本复制和 Balancer 共用该参数
适合 限制整个节点访问 HDFS 端口(50010、8020 等)的流量
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 50010 0xffff flowid 1:1
✅ 最常用 & 安全
hdfs-site.xml
dfs.datanode.balance.bandwidthPerSec = 10MB/s
✅ 任务高峰期
ionice + tc✅ 单独跑 Balancer
hdfs balancer -bandwidth 10m
| 场景 | 方法 |
|---|---|
| HDFS 数据复制慢 | dfs.datanode.balance.bandwidthPerSec |
| Balancer 太快 | hdfs balancer -bandwidth |
| 磁盘 IO 高 | ionice |
| 网络带宽占用高 | tc |
| 任务并发太高 | YARN 限制 container |
如果你愿意,可以告诉我:
我可以给你一套 可直接用的配置方案。