文章目录
【前言】大规模Hadoop集群,各个datanode节点磁盘空间使用率经常会出现分布不均衡的情况,其原因在于优先本地化存储,或者节点异常导致的转储备份。如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mapred的工作效率。
- balancer命令详解
hdfs --config /hadoop-client/conf balancer
-threshold 10 \\集群平衡的条件,datanode间磁盘使用率相差阈值,区间选择:0~100
-policy datanode \\默认为datanode,datanode级别的平衡策略
-exclude -f /tmp/ip1.txt \\默认为空,指定该部分ip不参与balance, -f:指定输入为文件
-include -f /tmp/ip2.txt \\默认为空,只允许该部分ip参与balance,-f:指定输入为文件
-idleiterations 5 \\迭代次数,默认为 5
hdfs balance时datanode之间数据迁移的带宽设置(/hadoop-client/conf/hdfs-site.xml, 修改需重启hdfs):
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>6250000</value>
</property>
<备注:6250000 / (1024 * 1024) = 6M/s>
或者设置临时带宽:
# hdfs dfsadmin -setBalancerBandwidth 6250000
动态增大带宽(不需重启,需要切换到hdfs用户,不可设置太大,会占用mapreduce任务的带宽):
hdfs dfsadmin -fs hdfs://${active-namenode-hostname}:8020 -setBalancerBandwidth 104857600
balance脚本在满足以下任何一个条件都会自动退出:
* The cluster is balanced;
* No block can be moved;
* No block has been moved for specified consecutive iterations (5 by default);
* An IOException occurs while communicating with the namenode;
* Another balancer is running.
- 运行balancer
hdfs balancer -threshold 10 #10为各节点存储的浮动比例10%上下浮动
- Hadoop Balancer的步骤:
1、从namenode获取datanode磁盘的使用情况
2、计算需要把哪些数据移动到哪些节点
3、分别移动,完成后删除旧的block信息
4、循环执行,直到达到平衡标准