前言
随着时间的增长集群总会出现数据分布不均衡的情况,尤其是在集群发生扩容之后,数据节点存储使用率差别会很大. 因此对集群数据均衡处理是有必要的.
HDFS平衡
针对于HDFS 平衡目前使用的最多的就是针对HDFS整体去进行平衡处理.
我们可以使用hadoop的页面管理工具,如clouder产品自带的重平衡按钮功能(CM首页->HDFS组件->操作->选择'重新平衡')
我们也可以用命令行的方式去后台执行,例如:
nohup hdfs balancer -threshold 10 &
如果你想优化平衡,你可以增加尝试修改以下参数去适配集群或者加快平衡:
nohup hdfs balancer -Ddfs.balancer.moverThreads=2000 -Ddfs.datanode.balance.max.concurrent.moves=40 -Ddfs.datanode.balance.bandwidthPerSec=1073741824 -Ddfs.balancer.dispatcherThreads=300 -Ddfs.balancer.getBlocks.min-block-size=62914560 -include {DN1},{DN2},{DN3}, -threshold 1 >/tmp/balancer-out_$(date +"%Y%m%d%H%M%S").log
以上参数解释:
dfs.balancer.moverThreads
控制balancer中用于移动块的线程数。每个块移动都需要一个线程,因此这种配置限制了整个集群中平衡的并发移动总数。
是控制balancer整体的最大移动block总数
dfs.datanode.balance.max.concurrent.moves
此参数定义了数据balance并行移动数据块的最大并发数。它限制了同时进行数据移动的任务数量。
是控制单个datanode的并发移动block数量
dfs.datanode.balance.bandwidthPerSec
根据每秒字节数指定每个datanode节点可用于平衡目的的最大带宽量。
dfs.balancer.dispatcherThreads
用于调度移动block块的线程池大小,只参与调度不参与实际移动block
dfs.balancer.getBlocks.min-block-size
移动最小块的大小限制
-include
只包括指定的datanode
-threshold
指定datanode存储使用率百分比与整体存储使用率百分比的差值,小于该值才会触发balancer
DataNode平衡
除了针对HDFS整体平衡外,你也可以针对单个的datanode进行平衡.顾名思义就是只对一个datanode上的数据盘进行平衡处理,相对于HDFS平衡范围更小.
datanode平衡步骤示例:
a.生成计划
hdfs diskbalancer -plan $(hostname -f) -bandwidth 104857600
b.执行计划
hdfs diskbalancer -execute /system/diskbalancer/2024-九月-11-17-47-19/demob.cdp.com.plan.json
c.查询平衡任务
hdfs diskbalancer -query $(hostname -f)
d.取消任务
hdfs diskbalancer -cancel $(hostname -f)
注: 只能在datanode节点去平衡自己的节点,否则会抛出权限异常,异常信息如下:
[root@demoa ~]# hdfs diskbalancer -plan demob.cdp.com -bandwidth 104857600
24/09/10 17:17:06 INFO balancer.NameNodeConnector: getBlocks calls for hdfs://nameservice1 will be rate-limited to 20 per second
24/09/10 17:17:06 INFO balancer.KeyManager: Block token params received from NN: update interval=10hrs, 0sec, token lifetime=10hrs, 0sec
24/09/10 17:17:06 INFO block.BlockTokenSecretManager: Setting block keys
24/09/10 17:17:06 INFO balancer.KeyManager: Update block keys every 2hrs, 30mins, 0sec
24/09/10 17:17:07 ERROR tools.DiskBalancerCLI: Exception thrown while running DiskBalancerCLI.
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied.
HDFS平衡逻辑步骤
1、从namenode获取datanode磁盘的使用情况
2、计算需要把哪些数据移动到哪些节点
3、分别移动,完成后删除旧的block信息
4、循环执行,直到达到平衡标准
因此在平衡过程中可能会出现一段时间数据存储反而增多的情况.
其他说明
1、HDFS平衡可以随时停止.
2、对于使用impala的业务,平衡之后可能会遇到以下告警信息:
query performance and not result correctness. One of the common causes for this warning is HDFS rebalanert moving some of the file's . if the issue persists, consider running "INVALIDATE METADATA `xxx`.`xxxxxx`"
此时就要按照提示执行:
INVALIDATE METADATA (生产环境尤其是表或者分区特别多的不建议整库刷新)