HDFS balancer详解

前言: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进行分开执行。

  1. Rebalance Server从Name Node中获取每一个Data Node磁盘使用情况。
  2. Rebalance Server计算哪些机器需要移动数据,哪些机器需要接受数据,从Name Node中获取需要移动的数据分布情况。
  3. Rebalance Server计算出从哪些机器中将数据移动到其他机器上。
  4. 移动机器中的block到其他机器中,同时删除自己的block数据。
  5. Rebalance Server获取到本次数据移动的执行结果,并继续移动其他数据,一直到没有数据可以移动或者HDFS集群以及达到了平衡的标准为止,然后向namenode提交更新后的datanodes信息。

默认情况下,datanode不会接受或移出少于10G的block或者少于datanode总容量threshold百分比的block,时间不会超过20分钟。
系统限制了datanode之间数据迁移的带宽最大值 dfs.datanode.balance.bandwidthPerSec


    dfs.datanode.balance.bandwidthPerSec
    6250000

<备注:6250000 / (1024 * 1024) = 6M/s>

动态增大带宽

hdfs dfsadmin -fs hdfs://${active-namenode-hostname}:8020 -setBalancerBandwidth 104857600

balancer在如下5种情况下会自动退出:

  1. 集群已达到均衡状态;
  2. 没有block能被移动;
  3. 连续5次迭代移动没有任何一个block被移动;
  4. 当与namenode交互式出现了IOException;
  5. 另一个balancer在运行中。

你可能感兴趣的