HDFS的balancer命令详解以及执行命令threads quota is exceeded报错解决

前言

用Hadoop集群一点时间时,HDFS节点间的数据不平衡,尤其在新增和下架节点、或者人为干预副本数量的时候,多的达到70%,少的40%。出现这种状况,我们一般采用HDFS自带的balancer工具来解决,保证每个节点的数据分布均衡。

balancer命令

  • balancer
1
2
3
4
5
6
# start:
start-balancer.sh #用默认的10%的阈值启动balancer
hdfs balancer -threshold 10
start-balancer.sh -threshold 10 #指定10%的阈值启动balancer
# stop:
stop-balancer.sh # 关闭平衡
  • balancer参数配置
1
2
3
4
5
6
7
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

命令报错

1
threads quota is exceeded

troubleshooting

1
2
3
4
5
6
7
8
9
10
11
<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集群的用途。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!