rebalance均衡
前言:Hadoop集群用久了以后,我们会发现一个问题,HDFS节点间的数据不平衡,尤其在新增和下架节点、或者人为干预副本数量的时候,多的达到80-90%,少的不到50%。出现这种状况,我们一般采用HDFS自带的balancer工具来解决,保证每个节点的数据分布均衡。
start-balancer.sh #用默认的10%的阈值启动balancer
hdfs dfs balancer -threshold 3
start-balancer.sh -threshold 3 #指定3%的阈值启动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在运行中。
参考
https://www.cnblogs.com/yinzhengjie2020/p/13342039.html
作者:TOTower
链接:https://www.jianshu.com/p/4488a38907a8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。