前言:Hadoop集群用久了以后,我们会发现一个问题,HDFS节点间的数据不平衡,尤其在新增和下架节点、或者人为干预副本数量的时候,多的达到80-90%,少的不到50%。出现这种状况,我们一般采用HDFS自带的balancer工具来解决,保证每个节点的数据分布均衡。
To start:
start-balancer.sh #用默认的10%的阈值启动balancer
hfs dfs balancer -threshold 3
start-balancer.sh -threshold 3 #指定3%的阈值启动balancer
To stop:
stop-balancer.sh
balancer参数配置
hdfs --config /hadoop-client/conf balancer
-threshold 10 \\集群平衡的条件,datanode间磁盘使用率相差阈值,区间选择:0~100
\\Threshold参数为集群是否处于均衡状态设置了一个目标
-policy datanode \\默认为datanode,datanode级别的平衡策略
-exclude -f /tmp/ip1.txt \\默认为空,指定该部分ip不参与balance, -f:指定输入为文件
-include -f /tmp/ip2.txt \\默认为空,只允许该部分ip参与balance,-f:指定输入为文件
-idleiterations 5 \\迭代次数,默认为 5
balance策略实现的逻辑流程
Rebalance程序作为一个独立的进程与name node进行分开执行。
- Rebalance Server从Name Node中获取每一个Data Node磁盘使用情况。
- Rebalance Server计算哪些机器需要移动数据,哪些机器需要接受数据,从Name Node中获取需要移动的数据分布情况。
- Rebalance Server计算出从哪些机器中将数据移动到其他机器上。
- 移动机器中的block到其他机器中,同时删除自己的block数据。
- Rebalance Server获取到本次数据移动的执行结果,并继续移动其他数据,一直到没有数据可以移动或者HDFS集群以及达到了平衡的标准为止,然后向namenode提交更新后的datanodes信息。
默认情况下,datanode不会接受或移出少于10G的block或者少于datanode总容量threshold百分比的block,时间不会超过20分钟。
系统限制了datanode之间数据迁移的带宽最大值 dfs.datanode.balance.bandwidthPerSec
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>6250000</value>
</property>
<备注:6250000 / (1024 * 1024) = 6M/s>
动态增大带宽
hdfs dfsadmin -fs hdfs://${active-namenode-hostname}:8020 -setBalancerBandwidth 104857600
balancer在如下5种情况下会自动退出:
- 集群已达到均衡状态;
- 没有block能被移动;
- 连续5次迭代移动没有任何一个block被移动;
- 当与namenode交互式出现了IOException;
- 另一个balancer在运行中。