前言
用Hadoop集群一点时间时,HDFS节点间的数据不平衡,尤其在新增和下架节点、或者人为干预副本数量的时候,多的达到70%,少的40%。出现这种状况,我们一般采用HDFS自带的balancer工具来解决,保证每个节点的数据分布均衡。
balancer命令
| start-balancer.sh hdfs balancer -threshold 10 start-balancer.sh -threshold 10
stop-balancer.sh
|
| 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
|
命令报错
| threads quota is exceeded
|
troubleshooting
| <property> <name>dfs.datanode.balance.max.concurrent.moves</name> <value>60</value> </property> <调大dfs.datanode.balance.max.concurrent.moves的值,例如改成60/>
<property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>52428800</value> </property> <修改dfs.datanode.balance.bandwidthPerSec的值,例如改成52428800,即50M,如果带宽允许,可调高到100M,这个参数是设置balancer进程可用的网络带宽。如果不设置这个参数值那么这个balancer会很慢,因为默认不允许balancer占用很大的网络带宽。/>
|
建议
执行balancer的建议:尽量不要在NameNode上执行balancer,而是找一台比较空闲的机器去运行
上传数据到hdfs集群的建议:若从某个dataNode上传数据到集群,会导致上传的数据优先写满该dataNode的磁盘,不利于运行分布式作业;但是从非dataNode上传,比如从nameNode上传数据,也不好,因为会增加namenode负担,同时造成namenode上面的文件杂乱。所以建议搞一个客户端节点,把hadoop的安装目录复制一份到此节点,不在此节点启动任何有关Hadoop的进程,只作为上传数据到hdfs集群的用途。