出现场景
- 集群中添加新的DataNode。
- 集群长时间运行,块分片算法导致节点间数据不均衡。
- 由于历史原因,hadoop集群中的机器的磁盘空间的大小各不相同,而HDFS在进行写入操作时,并没有考虑到这种情况,所以随着数据量的逐渐增加,磁盘较小的datanode机器上的磁盘空间很快将被写满,各数据节点磁盘占用率不同。
导致问题
- MR程序无法很好地利用本地计算的优势。
- 机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等。
解决方式
在Hadoop提供平衡节点数据均衡的程序,在空闲节点使用命令:$HADOOP_HOME/sbin/start-balancer.sh –t 10%
这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值,如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡的状态。
Balancer程序遵循了以下几点原则:
- 在执行数据重分布的过程中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个rack中所具备的block数量。(考虑移动不同rack中的机器)
- 系统管理员可以通过一条命令启动数据重分布程序或者停止数据重分布程序。
- Block在移动的过程中,不能暂用占多的资源,如网络带宽。
- 数据重分布程序在执行的过程中,不能影响NameNode的正常工作。
Balancer执行过程,Balance程序作为一个独立的进程与NameNode进行分开执行。
- Balance Server从NameNode中获取所有的DataNode情况:每一个DataNode磁盘使用情况。
- Balance Server计算哪些机器需要将数据移动,哪些机器可以接受移动的数据。并且从NameNode中获取需要移动的数据分布情况。
- Balance Server计算出来可以将哪一台机器的block移动到另一台机器中去。
- 将需要移动block的机器数据移动的目的机器上去,同时删除自己机器上的block数据。
- 将balance Server获取到本次数据移动的执行结果,并继续执行这个过程,一直没有数据可以移动或者HDFS集群以及达到了平衡的标准为止。
其它参数参考:
参考:
《深入浅出:Hadoop的start-balancer.sh与hdfs balancer分布式数据均衡》深入浅出:Hadoop的start-balancer.sh与hdfs balancer分布式数据均衡-阿里云开发者社区