Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡
Posted 小毕超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop3 - HDFS Block 负载平衡以及 Disk 平衡相关的知识,希望对你有一定的参考价值。
一、HDFS Block 负载平衡
上篇文章介绍了 HDFS 的动态扩容和缩容,其中使用到了一个 hdfs balancer
指令,主要对不同的DataNode
之间均匀分布数据,本篇文章对 DataNode
之间 以及 单个 DataNode
多个磁盘均匀分布数据讲解,下面是上篇文章的地址:
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
104857600
为 100M
表示每个DataNode
在平衡操作期间可以使用的最大网络带宽量,以每秒字节数为单位。
二、HDFS Disk 平衡
上面提到的 Balancer
平衡器无法在单个 DataNode
上的各个卷(磁盘)之间进行平衡。而在 HDFS
中,DataNode
负责最终数据block
的存储,在所在机器上的磁盘之间分配数据块。当写入新block
时,DataNodes
将根据选择策略(循环策略 或 可用空间策略)来选择block
的磁盘(卷)。
循环策略
:它将新block
均匀分布在可用磁盘上。默认此策略。
可用空间策略
:此策略将数据写入具有更多可用空间(按百分比)的磁盘。
如果长期运行的群集中采用循环策略,DataNode
有时会不均匀地填充其存储目录(磁盘/卷),从而导致某些磁盘已满而其他磁盘却很少使用的情况。发生这种情况的原因可能是由于大量的写入和删除操作,也可能是由于更换了磁盘。如果我们使用基于可用空间的选择策略,则每个新写入将进入新添加的空磁盘,从而使该期间的其他磁盘处于空闲状态。这将在新磁盘上创建瓶颈。
因此,Hadoop 3.0
中引入了一个名为Disk Balancer
的工具,该工具专注于在DataNode
内分发数据。
HDFS disk balancer
是Hadoop 3
中引入的命令行工具,用于平衡DataNode
中的数据在磁盘之间分布不均匀问题。
为了定义一种方法来衡量集群中哪些计算机遭受数据分布不均的影响,HDFS
磁盘平衡器定义了HDFS Volume Data Density metric
(卷/磁盘数据密度度量标准)和Node Data Density metric
(节点数据密度度量标准)。其中Node Data Density metric
能够比较数据在给定节点的不同卷上的分布情况。
Volume data density metric 计算过程
假设有一台具有四个卷/磁盘的计算机 Disk1,Disk2,Disk3,Disk4
,各个磁盘使用情况:
Disk1 | Disk2 | Disk3 | Disk4 | |
---|---|---|---|---|
capacity | 200 GB | 300 GB | 350 GB | 500 GB |
dfsUsed | 100 GB | 76 GB | 300 GB | 475 GB |
dfsUsedRatio | 0.5 | 0.25 | 0.85 | 0.95 |
volumeDataDensity | 0.20 | 0.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
= idealStorage
– dfs 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
值表示该机器节点具有较好的扩展性,而较高的值表示节点具有更倾斜的数据分布。
一旦有了volumeDataDensity
和nodeDataDensity
,就可以找到集群中数据分布倾斜的节点,或者可以获取给定节点的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 平衡