hadoop集群某个节点dfs存储比其他节点存储高时,一般会使用hadoop提供的balance(start-balancer.sh -threshold 10 )工具来移动高存储节点上的块到低存储节点上.
其中 -threshold 默认设置:10,参数取值范围:0-100,参数含义:判断集群是否平衡的目标参数,每一个 datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值 ,理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法达到设定的平衡参数值
进行平衡时,可能会抛出 "because threads quota is exceeded., block move is failed" 这样的异常,这是因为在rebalanecing server启动的线程数有限,hdfs-site.xml配置中(dfs.datanode.balance.max.concurrent.moves)默认配置是5,可以适当将该值调大
在hdfs-site.xml中(注意!!!相应的datanode节点也要设置,不然运行时会抛异常,配置后重新启动对应的namenode与datanode)
<property> <name>dfs.datanode.balance.max.concurrent.moves</name> <value>1024</value> </property>
一般主机性能好的可以调整到300~1024不等
在运行时拷贝的数据也会受带宽影响,hdfs-site.xml中(dfs.datanode.balance.bandwidthPerSec)默认配置值是1M即是1048576字节,视集群带宽情况而定(ifconfig 命令查看网卡,ethtool 命令 指定网卡 如:ethtool eth1 查看带宽其中的Speed项就是带宽)设置好带宽
<property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>10485760</value> </property>
另外,一般在平衡时,可以先停止存储比较高的节点上的nodemanager,这样在该节点上就不会受本地nodemanager落数据到本地,使得本地存储迅速增加的影响.