Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡相关的知识,希望对你有一定的参考价值。

一、HDFS Block 负载平衡

上篇文章介绍了 HDFS 的动态扩容和缩容,其中使用到了一个 hdfs balancer 指令,主要对不同的DataNode之间均匀分布数据,本篇文章对 DataNode之间 以及 单个 DataNode多个磁盘均匀分布数据讲解,下面是上篇文章的地址:

https://blog.csdn.net/qq_43692950/article/details/127185292

HDFS 数据可能并不总是在DataNode之间均匀分布。有可能会因为群集中添加了新的DataNode而出现分布不均的情况。HDFS 提供了一个Balancer程序,分析block放置信息并且在整个DataNode节点之间平衡数据,直到被视为平衡为止。所谓的平衡指的是每个DataNode的利用率(本机已用空间与本机总容量之比)与集群的利用率(HDFS整体已用空间与HDFS集群总容量的比)之间相差不超过给定阈值百分比。


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 balancer -threshold 5

Balancer将以阈值5%运行(默认值10%),这意味着程序将确保每个DataNode上的磁盘使用量与群集中的总体使用量相差不超过5%。例如,如果集群中所有DataNode的总体使用率是集群磁盘总存储容量的40%,则程序将确保每个DataNode的磁盘使用率在该DataNode磁盘存储容量的35%45%之间。

在平衡之前,一般需要限制下平衡的带宽,以免影响正常的服务:

hdfs dfsadmin -setBalancerBandwidth 104857600

104857600100M 表示每个DataNode在平衡操作期间可以使用的最大网络带宽量,以每秒字节数为单位。

二、HDFS Disk 平衡

上面提到的 Balancer 平衡器无法在单个 DataNode 上的各个卷(磁盘)之间进行平衡。而在 HDFS中,DataNode负责最终数据block的存储,在所在机器上的磁盘之间分配数据块。当写入新block时,DataNodes将根据选择策略(循环策略可用空间策略)来选择block的磁盘(卷)。

循环策略:它将新block均匀分布在可用磁盘上。默认此策略。

可用空间策略:此策略将数据写入具有更多可用空间(按百分比)的磁盘。

如果长期运行的群集中采用循环策略,DataNode有时会不均匀地填充其存储目录(磁盘/卷),从而导致某些磁盘已满而其他磁盘却很少使用的情况。发生这种情况的原因可能是由于大量的写入和删除操作,也可能是由于更换了磁盘。如果我们使用基于可用空间的选择策略,则每个新写入将进入新添加的空磁盘,从而使该期间的其他磁盘处于空闲状态。这将在新磁盘上创建瓶颈。

因此,Hadoop 3.0中引入了一个名为Disk Balancer的工具,该工具专注于在DataNode内分发数据。

HDFS disk balancerHadoop 3中引入的命令行工具,用于平衡DataNode中的数据在磁盘之间分布不均匀问题。

为了定义一种方法来衡量集群中哪些计算机遭受数据分布不均的影响,HDFS磁盘平衡器定义了HDFS Volume Data Density metric(卷/磁盘数据密度度量标准)和Node Data Density metric(节点数据密度度量标准)。其中Node Data Density metric 能够比较数据在给定节点的不同卷上的分布情况。

Volume data density metric 计算过程

假设有一台具有四个卷/磁盘的计算机 Disk1,Disk2,Disk3,Disk4,各个磁盘使用情况:

Disk1Disk2Disk3Disk4
capacity200 GB300 GB350 GB500 GB
dfsUsed100 GB76 GB300 GB475 GB
dfsUsedRatio0.50.250.850.95
volumeDataDensity0.200.45-0.15-0.24

Total capacity= 200 + 300 + 350 + 500 = 1350 GB

Total Used= 100 + 76 + 300 + 475 = 951 GB

因此,每个卷/磁盘上的理想存储为:

Ideal storage = total Used ÷ total capacity = 951÷1350 = 0.70

也就是每个磁盘应该保持在 70%理想存储容量。

VolumeDataDensity = idealStoragedfs Used Ratio

比如Disk1的卷数据密度= 0.70-0.50 = 0.20。

volumeDataDensity 的正值表示磁盘未充分利用,而负值表示磁盘相对于当前理想存储目标的利用率过高。

Node Data Density计算过程

Node Data Density(节点数据密度)= 该节点上所有卷/磁盘volume data density绝对值的总和。

上述例子中的节点数据密度=|0.20|+|0.45|+|-0.15|+|-0.24| =1.04

较低的Node Data Density值表示该机器节点具有较好的扩展性,而较高的值表示节点具有更倾斜的数据分布。

一旦有了volumeDataDensitynodeDataDensity,就可以找到集群中数据分布倾斜的节点,或者可以获取给定节点的volumeDataDensity

HDFS Disk Balancer通过创建计划进行操作,该计划是一组语句,描述应在两个磁盘之间移动多少数据,然后在DataNode上执行该组语句。计划包含多个移动步骤。计划中的每个移动步骤都具有目标磁盘,源磁盘的地址。移动步骤还具有要移动的字节数。

默认情况下,Hadoop群集上已经启用了Disk Balancer功能。通过在hdfs-site.xml中调整dfs.disk.balancer.enabled参数值。

HDFS Disk Balancer相关命令

  • Plan计划
hdfs diskbalancer -plan <datanode>
-out	//控制计划文件的输出位置
-bandwidth	//设置用于运行Disk Balancer的最大带宽。默认带宽10 MB/s。
–thresholdPercentage  //定义磁盘开始参与数据重新分配或平衡操作的值。默认的thresholdPercentage值为10%,这意味着仅当磁盘包含的数据比理想存储值多10%或更少时,磁盘才用于平衡操作。
-maxerror	//它允许用户在中止移动步骤之前为两个磁盘之间的移动操作指定要忽略的错误数。
-v	//详细模式,指定此选项将强制plan命令在stdout上显示计划的摘要。
-fs	//此选项指定要使用的NameNode。如果未指定,则Disk Balancer将使用配置中的默认NameNode 。
  • Execute执行,针对为其生成计划的DataNode执行计划
hdfs diskbalancer -execute <JSON file path>
  • Query查询,从运行计划的DataNode获取HDFS磁盘平衡器的当前状态
hdfs diskbalancer -query <datanode>
  • Cancel 取消运行的计划
hdfs diskbalancer -cancel <JSON file path>
hdfs diskbalancer -cancel planID node <nodename>
  • Report 汇报
hdfs diskbalancer -fs https://namenode.uri -report <file://>

以上是关于Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡

Hadoop3新特性

HDFS Balancer负载均衡器

HDFS负载均衡器

读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理

HDFS编程实践(Hadoop3.1.3)