赞
踩
前面某篇文章已经说过,HDFS容易发生数据不平衡的问题。这其中包括各个DataNode之间存储的数据量差异,以及一个DataNode内部各磁盘之间存储的数据量差异。HDFS专门提供了对应的机制来解决。
CDH在HDFS中提供了Balancer角色,使我们可以免于用命令行执行start-balancer.sh来手动配置。Cloudera Manager里与Balancer有关的配置项有以下这些。
CDH Balancer的用法很简单,只需要设定好上述参数,再点击Actions→Rebalance菜单项,就会自动开始平衡了。
那么Balancer内部是如何执行的呢?Balancer类的源码位于org.apache.hadoop.hdfs.server.balancer
包中,限于篇幅,就不贴出来了,只简单叙述一下。
Balancer是迭代执行的,也就是说每次平衡都只移动一定量的数据,然后检查集群是否符合平衡的标准。迭代的大致步骤是:
从宏观上看,就是这张图。
节点间数据平衡的流程
如果想要解决节点内多块磁盘数据不均衡的现象,就要借助DiskBalancer。在CDH 5.8.2+版本中,可以通过在CM中配置进行开启。如果使用的Hadoop版本是3.0+,就直接在hdfs-site.xml中加入相关项。
在HDFS配置项中找到“DataNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml”,中文为“hdfs-site.xml的HDFS服务⾼级配置代码段(安全阀)”,加入:
- <property>
- <name>dfs.disk.balancer.enabled</name>
- <value>true</value>
- </property>
- <property>
- <name>dfs.disk.balancer.max.disk.throughputInMBperSec</name>
- <value>50</value>
- </property>
- <property>
- <name>dfs.disk.balancer.plan.threshold.percent</name>
- <value>2</value>
- </property>
- <property>
- <name>dfs.disk.balancer.block.tolerance.percent</name>
- <value>5</value>
- </property>

DiskBalancer的运行流程与Balancer类似,不过对象由节点变成了磁盘。它分为Discover、Plan与Execute三个阶段,分别是计算磁盘不平衡度、生成平衡计划与执行平衡计划。关于它的设计细节,可以参考JIRA中的HDFS-1312:https://issues.apache.org/jira/browse/HDFS-1312。
配置完成后,重启DataNode,然后SSH到该节点上,手动执行即可:
hdfs diskbalancer -plan hadoop1
hdfs diskbalancer -execute /system/diskbalancer/hadoop1.plan.json
hdfs diskbalancer -query hadoop1
作者:LittleMagic
链接:https://www.jianshu.com/p/5c6459fbe9ee
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。