HDFS数据均衡机制确保数据在集群中均匀分布,避免某些节点过载而其他节点空闲,从而优化集群性能和存储利用率。
HDFS Balancer
HDFS Balancer是HDFS自带的数据均衡工具,用于在DataNode之间重新分配数据块,使各节点的存储使用率保持在一个合理的差距范围内。它通过扫描各 DataNode 存储使用率,对比预设平衡阈值,将过载节点的数据块迁移至空闲节点,迁移过程严格遵循 HDFS 副本放置策略,确保数据可靠性。工具支持后台运行,可灵活配置平衡阈值与迁移带宽,避免占用过多集群资源。数据均衡后,能有效降低部分节点过载风险,提升 HDFS 读写性能与集群整体稳定性,是保障大规模 HDFS 集群长期高效运行的关键手段。
工作原理
Balancer计算各DataNode的存储使用率。
识别需要移动的数据块(从高使用率节点到低使用率节点)。
制定移动计划(考虑数据块优先级和网络拓扑)。
执行数据块复制和删除操作。
重复直到所有节点的使用率差距在阈值内。
使用方法
1、登录客户端,切换用户到hdfs,完成Kerberos认证
kinit -kt /etc/security/keytabs/hdfs.keytab `klist -kt /etc/security/keytabs/hdfs.keytab |sed -n 4p |awk '{print $NF}'`2、启动HDFS Balancer
hdfs --daemon start balancer HDFS Balancer提供自定义参数,可按需配置。配置参考如下:
命令行参数:
| 配置项 | 默认值 | 描述 |
|---|---|---|
| -policy <policy> | datanode | 有效值:datanode 、blockpool datanode:用所有nameservices存储使用之和来计算节点存储使用率。 blockpool:只用当前迭代的nameservice存储使用来计算存储使用率。 |
| -threshold <threshold> | 10 | 需要配置为0-100 的正整数。集群中需要存在节点大于或小于平均存储使用的10%才会启动balance。 |
| -source | - | 设置哪些节点作为数据源,设置为ip或hostname;多个节点用","分割。 |
| -include | - | 设置参与balance的节点,设置为ip或hostname;多个节点用","分割;不能和-exclude 同时配置。 |
| -exclude | - | 设置不参与balance的节点,设置为ip或hostname;多个节点用","分割 ;不能和-include 同时配置。 |
| -blockpools <blockpools> | - | 设置哪些blockpool参与balance;多个blockpool用","分割。 |
| -asService | - | 表示长期运行;默认每5min执行一次。 |
相关配置参数:
| 配置项 | 默认值 | 描述 |
|---|---|---|
| dfs.namenode.get-blocks.max-qps | 20 | 限制balancer每秒执行getblocks的次数。 |
| dfs.balancer.dispatcherThreads | 200 | 可同时调度多少个<Source, Target>。 |
| dfs.balancer.movedWinWidth | 5400000 | 单位ms;表示movedBlock的保留窗口时间;保留已经moved的block多长时间。 |
| dfs.balancer.moverThreads | 1000 | 最大并发多少个move。 |
| dfs.datanode.balance.max.concurrent.moves | 100 | 每个<Source, Target>最多并发执行多少个move;上限受限于服务端配置。 |
| dfs.balancer.getBlocks.size | 2147483648 | 每次向namenode获取多少数据量的blcok。 |
| dfs.balancer.getBlocks.min-block-size | 10485760 | 获取block的最小size。 |
| dfs.balancer.max-size-to-move | 10737418240 | <Source, Target>一次迭代最大移动的数据量。 |
| dfs.balancer.service.interval | 300000 | 单位ms;配置-asService时生效;定义balancer执行周期。 |
HDFS Balancer日志路径:/var/log/hadoop/hdfs/hadoop-hdfs-balancer-<hostname>.log
注意
1、执行HDFS Balancer时,DataNode端可使用的带宽默认是100MB/s,若需要调整带宽,可在执行HDFS Balancer前通过如下命令调整:
# 按需根据nameservice配置-fs
hdfs dfsadmin -fs hdfs://ctyunns -setBalancerBandwidth 1048576002、如果HDFS客户端内存上限较小,则在数据均衡过程中可能会报错“OutOfMemoryError”。可根据实际情况,调整内存大小,例如调整堆内存最大值为1GB:
export HADOOP_CLIENT_OPTS="-Xmx1g-Xms1g"注意
Balancer在后台运行,不阻塞正常的HDFS操作,但会占用一定的网络带宽和IO资源。
建议在业务低峰期运行。
均衡时间与数据量和网络速度相关。
HDFS DiskBalancer
HDFS DiskBalancer是磁盘级均衡工具,用于在单个DataNode的多个磁盘之间重新平衡数据。
适用场景
新增磁盘后需要重新平衡数据。
某些磁盘使用过高需要分担数据。
磁盘故障更换后需要恢复数据均衡。
优化磁盘IO性能,分散IO压力。
手动执行磁盘均衡
使用时把<nodename>替换对应DataNode的hostname或ip。
1、登录客户端机器,切换到hdfs用户,并完成用户认证
kinit -kt /etc/security/keytabs/hdfs.keytab `klist -kt /etc/security/keytabs/hdfs.keytab |sed -n 4p |awk '{print $NF}'`2、生成执行计划
HDFS的上的路径/system/diskbalancer/<nodename>需要不存在,可提前判断,若存在则删除。
生成执行计划:
hdfs diskbalancer -plan <nodename>-out /system/diskbalancer/<nodename>3、执行DiskBalancer
先判断/system/diskbalancer/<nodename>/<nodename>.plan.json是否存在,若不存在则说明无需DiskBalancer。
执行DiskBalancer:
hdfs diskbalancer -execute /system/diskbalancer/<nodename>/<nodename>.plan.json4、查询DiskBalancer状态
根据命令返回值判断,”Result: PLAN_DOWN”表示均衡完成。
查询DiskBalancer状态:
hdfs diskbalancer -query <nodename>5、若需要手动退出DiskBalancer
hdfs diskbalancer -cancel /system/diskbalancer/<nodename>/<nodename>.plan.json