HDFS节点内数据平衡

Hadoop集群使用久了,我们会发现一个问题,各个DataNode数据不平衡了,多的达到70-80%,少的达到10-20%。面对这种场景,我们一般使用HDFS自带的Blancer工具对其数据进行平衡。也就是他只能保证每一个节点的数据大小均衡。

 

但是有的时候,你会发现节点数据平衡了但是DataNode内部各个磁盘块上的数据不平衡了,这个Blancer就干不了这活儿。

 

比如某一个DataNode总共有A,B,C,D四块磁盘,你用RoundRobin磁盘选择策略去写,最后四块磁盘都写过了,但是A,B写的可能就1M,C,D写的就是100M.

 

一 DataNode节点磁盘数据不均衡带来的问题

1.1磁盘间数据不均衡间接导致磁盘I/O压力不同。我们知道,HDFS上的数据访问频率是很高的,这就涉及到大量的读写磁盘操作,数据多的磁盘自然就会有更高的频率访问,如果一块磁盘的IO操作非常密集的话,势必会对读写性能造成影响

1.2高使用率的磁盘导致节点写数据块的时候,可选的存储目录减少。

HDFS在写block的时候,会挑选剩余空间满足待写的block的大小情况下,才会进行挑选,如果高使用率磁盘目录过多,会导致这样的候选变少。

 

二 传统的解决方案

人工移动数据块存储目录:但是需要保证目录移动的准确性,否则会造成移动完目录后数据找不到的现象。

比如:

/data/1/dfs/dn/current/BP-XXXXX/current/finalized/subdir0/subdir1

目标路劲:

/data/2/dfs/dn/current/BP-XXXXX/current/finalized/subdir0/subdir1

目录结构就变了,current前面多了个空格,就会造成HDFS找不到这个数据块。

 

三 社区解决方案DiskBlancer

3.1设计核心

第一:DataSpread Report。 数据分布式的汇报,也就是支持各个DataNode汇报磁盘块使用情况的功能,我们就可以了解到目前集群内使用率TopN的节点磁盘

 

第二:DiskBlance。 进行磁盘数据平衡。但是在磁盘数据平衡的时候要考虑到各个磁盘StorageType的不同。不同的类型存储介质可能不一样,目前DiskBlancer还不支持跨存储介质数据转移,必须在一个StorageType下

 

 

3.2流程分析

Discover阶段:

计算各个DataNode磁盘使用情况,然后得到一个需要进行数据平衡的磁盘列表,会使用VolumeData Density(磁盘使用密度)作为评判标准,这个标准会以节点总使用率作为比较值。比如,如果一个DataNode  ,总使用率是75%,也就是0.75. 其中A盘0.5,那么A盘的密度值就=0.75-0.5=0.25;同理如果超出的话,则密度值将会为负数。于是我们可以用VolumeData Density绝对值来判断此节点内磁盘间数据平衡情况,如果总的觉得值和越大,说明数据越不平衡

 

Plan阶段:

拿到上一个阶段的汇报结果数据之后,将会生成一个执行计划。Plan并不是一个最小的执行单元,它是由各个Step组成的,Step中会指定好源磁盘,目标磁盘,这里是结果包装的:DiskBalancerVoulme,并不是原来的FSVolume.

DiskBalancerCluster:读取集群节点信息

DiskBalancerDataNode:代表一个包装过的DataNode

DiskBalancerVolume和 DiskBalancerVolumeSet.DataNode磁盘对象以及磁盘对象集合

 

Execute阶段:

所有执行计划生成以后,就到了执行阶段。这些计划会被提交到各自DataNode上,然后在DiskBalancer类中执行。然后DiskBalancer有专门的类DiskBalancerMover来做数据平衡工作。在磁盘间数据平衡的过程中,高使用率的磁盘会移动数据块到相对低使用率的磁盘,等到满足一定阈值关系的情况下时,DiskBalancer会渐渐地退出.在DiskBalancer的执行阶段,有以下几点需要注意:

 

带宽限制:DiskBalancer也可以支持带宽限制。默认是10M,可以通

过配置项dfs.disk.balancer.max.disk.throughputInMBperSec进行控制

失败次数限制:DiskBalancer中会存在失败次数的控制.在拷贝block数据块的时候,出现IOException异常,会进行失败次数的累加计数,如果超出最大容忍值,DiskBalancer也会退出.

数据平衡阀值控制:DiskBalancer中可以提供一个磁盘间数据的平衡阈值,以此作为是否需要继续平衡数据的标准,配置项为dfs.disk.balancer.block.tolerance.percent.

 

四 DiskBalancer的命令执行

DiskBalancer内部提供了许多类别的命令操作,比如下面的查询命令:

hdfsdiskbalancer -query nodename.mycluster.com

我们也可以执行相应的plan命令来生成plan计划文件.

hdfsdiskbalancer -uri hdfs://mycluster.com -plan node1.myclsuter.com

然后我们可以用生成好后的json文件进行DiskBalancer的执行

hdfsdiskbalancer -execute /system/diskbalancer/nodename.plan.json

当然,如果我们发现我们执行了错误的plan,我们也可以通过cancel命令进行清除:

hdfsdiskbalancer -cancel /system/diskbalancer/nodename.plan.json

hdfsdiskbalancer -cancel <planID> -node <nodename>

HDFS的DataNode节点数据不均衡指的是在HDFS集群中,不同的DataNode节点存储的数据量不一致。这可能导致某些节点负载过重,而其他节点负载较轻。 导致数据不均衡的主要原因有以下几点: 1. 初始复制:当数据进入HDFS时,会将其初始复制到不同的DataNode节点。由于网络延迟或节点性能差异等原因,可能导致某些节点复制的数据过多,而其他节点复制的数据较少。 2. 数据块移动:当节点故障或离线时,HDFS会将其上存储的数据块移动到其他健康的节点上。这个过程可能导致一些节点存储的数据块数量过多,而其他节点数据块较少。 为了解决数据不均衡的问题,HDFS采取了一些策略: 1. 副本平衡HDFS会定期检查集群中各个节点上的数据块数量,并采取副本平衡的措施。这意味着将数据块从负载过重的节点移动到负载较轻的节点上,以实现数据均衡。 2. 块调度:HDFS的块调度器会根据各个节点上的剩余存储空以及网络带宽等因素,决定将新的数据块复制到哪些节点上,以实现负载均衡。 3. HDFS管理员操作:HDFS管理员可以手动干预,将一些数据块从负载过重的节点移动到其他节点上,以实现数据均衡。 综上所述,数据不均衡是HDFS集群中的一个常见问题。通过副本平衡、块调度和管理员操作等策略,HDFS可以实现数据的均衡分布,提高数据的可靠性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值