前提:
CDH5.16.2
由于数据量过多,磁盘大小太小,导致磁盘使用率高达90%以上,于是新增磁盘,可问题来了,如何将这两块磁盘上的数据进行均衡呢?
本次基于CDH来做
1.设置dfs.disk.balancer.enabled 为true
2.生成平衡计划(cbp9.chinaoly.com为主机名)
hdfs diskbalancer -plan cbp9.chinaoly.com(需要均衡的机器) 会生成一个*.plan.json的文件
3.执行平衡计划
hdfs diskbalancer -execute /system/diskbalancer/2021-Feb-2-20-11-14/cbp9.chinaoly.com.plan.json
4.查看执行状态
hdfs diskbalancer -query cbp9.chinaoly.com
DONE的时候表示已经执行完毕
备注:
此过程由于数据量相对比较大,磁盘IO、网络IO占用都会比较高,虽然有参数可以配置,如dfs.datanode.balance.bandwidthPerSec,但仍然建议在集群负载不高时进行,特别是生产集群。另外执行时间的长度取决于:数据量、网络IO、磁盘IO及新写入的数据量大小
可同时配置dfs.datanode.fsdataset.volume.choosing.policy(磁盘的选择策略)
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.