概览
Diskbalancer 是一个命令行工具,可以在某个datanode的所有磁盘上均匀地分布数据。这个工具不同于负责整个集群数据平衡的 Balancer 。由于以下几个原因,数据可能在节点上的磁盘之间不均匀地传播。这可能是由于大量的写和删除操作或者磁盘替换造成的。这个工具对给定的datanode进行操作,并将块从一个磁盘移动到另一个磁盘。
架构
磁盘平衡器通过创建一个计划来运行,然后在 datanode 上执行该计划。计划是一组描述两个磁盘之间应该移动多少数据的语句。一个计划由多个步骤组成。移动计划包括源磁盘、目标磁盘和要移动的字节数。磁盘平衡器不会干扰其他进程,因为它会限制每秒钟复制多少数据。请注意,在群集上默认情况下没有启用磁盘平衡器。要启用 diskbalancer dfs.disk.balancer.enabled 必须在 hdfs-site.xml 中设置为 true。
命令
下面几节讨论磁盘平衡器支持哪些命令以及如何使用它们。
计划
可以通过运行 plan 命令在给定的datanode上运行
hdfs diskbalancer -plan node1.mycluster.com
该命令接受通用选项Generic Options。
plan 命令还具有一组参数,允许用户控制计划的输出和执行。
命令选项 | 描述 |
---|---|
-out | 允许用户控制计划文件的输出位置 |
-bandwidth | 由于 datanode 可能正在运行其他作业,所以 diskbalancer 限制每秒移动的数据量。此参数允许用户设置要使用的最大带宽。 |
-thresholdPercentage | 由于我们面向的是datanode 的snap-shot进行操作,因此移动操作有容忍百分比来宣布成功。如果用户指定10% 并且移动操作大小为20gb,如果我们可以移动18gb,那么该操作被认为是成功的。这是为了实时适应datanode中的变化。可选参数,如果未指定则使用默认值 |
-maxerror | maxerror允许用户指定在终止移动步骤之前必须有多少块复制操作失败。同样,这是个可选参数,如果没有指定,则使用系统默认值 |
- v |
详细模式,指定此参数将强制 plan 命令在 stdout 上打印计划的摘要 |
- f |
- 指定要使用的名称。如果没有指定默认配置使用 |
plan 命令有两个输出文件, <nodename>.before.json
(用来记录执行命令前的状态)、<nodename>.plan.json
。
执行
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
这通过从计划文件读取 datanode 的地址来执行计划。
查询
Query 命令从datanode获取磁盘平衡器的当前状态。
hdfs diskbalancer -query nodename.mycluster.com
命令选项 | 描述 |
---|---|
- v |
详细模式,打印移动状态 |
取消
取消命令取消正在运行的计划。
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
或
hdfs diskbalancer -cancel planID -node nodename
可以使用 query 命令从 datanode 读取计划 ID。
报告
Report 命令提供指定节点的详细报告,这些节点将从运行磁盘平衡器中受益。可以通过主机文件或以逗号分隔的节点列表指定节点。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
或
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
设置
有一组磁盘均衡器设置可以通过 hdfs-site. xml 控制
环境 | 描述 |
---|---|
dfs.disk.balancer.enabled |
该参数控制集群是否启用diskbalancer。如果不启用,任何execute命令都会被datanode拒绝。默认值为false。 |
dfs.disk.balancer.max.disk.throughputInMBperSec |
这控制磁盘平衡器在复制数据时消耗的最大磁盘带宽。如果指定的值是10MB,那么平均来说 diskbalancer 只会复制10MB/s。默认值为10MB/s |
dfs.disk.balancer.max.disk.errors |
设置两个磁盘之间的特定移动在放弃之前可以忽略的最大错误数的值。例如,如果一个计划要在3对磁盘之间进行复制,而第一个磁盘集遇到5个以上的错误,那么我们就放弃第一个复制并开始计划中的第二个复制。最大错误的默认值设置为5 |
dfs.disk.balancer.block.tolerance.percent |
容差百分比指定我们何时达到任何复制步骤所需的足够好的值。例如,如果指定10% ,那么接近目标值的10% 就足够了 |
dfs.disk.balancer.plan.threshold.percent |
计划中的卷数据密度的百分比阈值。如果一个节点的卷数据密度的绝对值超出了阈值,则意味着与磁盘对应的卷应该在计划中进行平衡。默认值是10 |