博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDFS数据平衡:节点间平衡与节点内平衡
阅读量:4214 次
发布时间:2019-05-26

本文共 2739 字,大约阅读时间需要 9 分钟。

前面某篇文章已经说过,HDFS容易发生数据不平衡的问题。这其中包括各个DataNode之间存储的数据量差异,以及一个DataNode内部各磁盘之间存储的数据量差异。HDFS专门提供了对应的机制来解决。

节点间平衡:Balancer

CDH在HDFS中提供了Balancer角色,使我们可以免于用命令行执行start-balancer.sh来手动配置。Cloudera Manager里与Balancer有关的配置项有以下这些。

  • Balancing Threshold:Balancer平衡的阈值。平衡过程结束后,所有节点的磁盘占用率与集群的平均占用率之差必须小于threshold(按百分比计)。默认值是10,我们设成了5。
  • Rebalancing Policy:计算平衡度的策略,有DataNode和BlockPool两种。前者是按节点级别来算,后者是按块池级别来算。后者只有对HDFS Federation才有效,所以我们选前者。
  • Included/Excluded Hosts:分别用来指定参与平衡的节点和被排除的节点。这样可以先人为判断数据分布情况,然后只让我们认为需要平衡的节点来操作。
  • dfs.balancer.moverThreads/dispatcherThreads:分别表示移动数据的线程池大小,和调度数据移动方案的线程池大小,默认值1000和200。
  • dfs.datanode.balance.max.concurrent.moves:表示能够同时移动的块(英文说法叫in-flight)数量,默认值50。
  • dfs.balancer.max-size-to-move:表示在Balancer的一次迭代(下面会提到)中,一个DataNode的最大数据交换量,默认值10G。
  • 另外,还有一个出现在DataNode参数但又与平衡相关的:dfs.datanode.balance.bandwidthPerSec,即每个节点可以用来做平衡的最大带宽,默认1MB/s。这个值在多数情况下是偏小的,可以适当增大,如10甚至20。千万注意不能挤占太多带宽,以保证正常业务的运行。

CDH Balancer的用法很简单,只需要设定好上述参数,再点击Actions→Rebalance菜单项,就会自动开始平衡了。

 

那么Balancer内部是如何执行的呢?Balancer类的源码位于org.apache.hadoop.hdfs.server.balancer包中,限于篇幅,就不贴出来了,只简单叙述一下。

Balancer是迭代执行的,也就是说每次平衡都只移动一定量的数据,然后检查集群是否符合平衡的标准。迭代的大致步骤是:

  1. 根据平衡度策略,计算出集群使用量均值,并与平衡阈值作比较,将节点按使用量从高到低划分为4类。
  2. 根据划分的4类节点,确认出需要平衡的源节点与目标节点对,并计算每对节点之间的数据交换量。
  3. 构造Dispatcher(这是与Balancer在同一个包中的类),初始化mover和dispatcher线程池。mover用来移动块,dispatcher用来调度节点对。
  4. 对每个节点上的块,确认它是否可以成为一个好的候选块。如果可以,那么它就会被移动到目标节点上去。

从宏观上看,就是这张图。

 

节点间数据平衡的流程

节点内平衡:DiskBalancer

如果想要解决节点内多块磁盘数据不均衡的现象,就要借助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服务⾼级配置代码段(安全阀)”,加入:

 

dfs.disk.balancer.enabled
true
dfs.disk.balancer.max.disk.throughputInMBperSec
50
dfs.disk.balancer.plan.threshold.percent
2
dfs.disk.balancer.block.tolerance.percent
5
  • dfs.disk.balancer.max.disk.throughputInMBperSec:指定磁盘间平衡时占用的最大磁盘带宽,默认值10MB/s。在不影响读写性能的情况下可以适当调大。
  • dfs.disk.balancer.plan.threshold.percent:各盘之间数据平衡的阈值。DiskBalancer中采用一种叫volume data density(卷数据密度)的度量来确定占用率的偏差值,该值越大,表明磁盘间的数据越不均衡。平衡过程结束后,每个盘的卷数据密度与平均密度之差必须小于threshold(按百分比计)。默认值是10,我们设成了5。
  • dfs.disk.balancer.block.tolerance.percent:在每次移动块的过程中,移动块的数量与理想平衡状态之间的偏差容忍值(按百分比计)。一般也设成5。

DiskBalancer的运行流程与Balancer类似,不过对象由节点变成了磁盘。它分为Discover、Plan与Execute三个阶段,分别是计算磁盘不平衡度、生成平衡计划与执行平衡计划。关于它的设计细节,可以参考JIRA中的HDFS-1312:。

配置完成后,重启DataNode,然后SSH到该节点上,手动执行即可:

  • 生成平衡计划(hadoop1为主机名)
    hdfs diskbalancer -plan hadoop1
  • 执行平衡计划
    hdfs diskbalancer -execute /system/diskbalancer/hadoop1.plan.json
  • 查看执行状态
    hdfs diskbalancer -query hadoop1

作者:LittleMagic
链接:https://www.jianshu.com/p/5c6459fbe9ee
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | GMNN: Graph Markov Neural Networks
查看>>
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>
文件描述符
查看>>
终端驱动程序:几个简单例子
查看>>
登录linux密码验证很慢的解决办法
查看>>
fcntl函数总结
查看>>
HTML条件注释
查看>>
内核态与用户态
查看>>
使用mingw(fedora)移植virt-viewer
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>