Hadoop3.2.0 HDFS磁盘平衡器

概述

Diskbalancer是一个命令行工具,可以在datanode的所有磁盘上均匀分配数据。此工具与Balancer不同, 后者负责集群范围的数据平衡。由于多种原因,数据在节点上的磁盘之间可能存在不均匀的扩散。这可能是由于大量写入和删除或由于磁盘更换造成的。此工具针对给定的datanode运行,并将块从一个磁盘移动到另一个磁盘。

架构

磁盘平衡器通过创建计划来运行,并继续在datanode上执行该计划。计划是一组语句,用于描述两个磁盘之间应移动的数据量。计划由多个移动步骤组成。移动步骤包括源磁盘,目标磁盘和要移动的字节数。可以针对操作数据节点执行计划。磁盘平衡器不应干扰其他进程,因为它会限制每秒复制多少数据。请注意,群集上默认情况下不启用磁盘平衡器。要启用diskbalancer,必须在hdfs-site.xml 中将dfs.disk.balancer.enabled设置为true。

命令

以下部分讨论磁盘平衡器支持的命令以及如何使用它们。

计划

可以通过运行对给定的datanode运行plan命令

hdfs diskbalancer -plan node1.mycluster.com

该命令接受通用选项

plan命令还有一组参数,允许用户控制计划的输出和执行。

命令选项 描述
-out 允许用户控制计划文件的输出位置。
-bandwidth 由于datanode可以运行并且可能正在运行其他作业,因此diskbalancer会限制每秒移动的数据量。此参数允许用户设置要使用的最大带宽。这不需要设置,因为如果未指定,则diskBalancer将使用默认带宽。
-thresholdPercentage 由于我们针对datanode的快照进行操作,因此移动操作具有声明成功的容差百分比。如果用户指定10%并且移动操作大小为20GB,那么如果我们可以移动18GB,那么该操作被认为是成功的。这是为了实时适应datanode的变化。不需要此参数,如果未指定,则使用默认值。
-maxerror 最大错误允许用户在中止移动步骤之前指定必须失败的块复制操作数。再次,这不是必需参数,如果未指定,则使用system-default。
-v 详细模式,指定此参数会强制计划命令在stdout上打印计划摘要。
-fs - 指定要使用的namenode。如果未指定,则使用默认配置。

plan命令写入两个输出文件。

是<nodename> .before.json,它在磁盘平衡器运行之前捕获集群的状态,<nodename> .plan.json。

执行

执行命令采用计划命令对生成计划的datanode执行它。

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

这通过从计划文件中读取datanode的地址来执行计划。当DiskBalancer执行计划时,它是异步过程的开始,可能需要很长时间。因此,query命令可以帮助获取执行命令的当前状态。

命令选项 描述
-skipDateCheck 跳过日期检查并强制执行计划。

询问

Query命令从datanode获取diskbalancer的当前状态。

hdfs diskbalancer -query nodename.mycluster.com

命令选项 描述
-v 详细模式,打印个别动作的状态

取消

取消命令取消正在运行的计划。重新启动datanode与cancel命令具有相同的效果,因为datanode上的计划信息是瞬态的。

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

或者

hdfs diskbalancer -cancel planID -node nodename

可以使用query命令从datanode读取计划ID。

报告

“报告”命令提供将从运行磁盘平衡器中受益的指定节点或顶级节点的详细报告。节点可以由主机文件或逗号分隔的节点列表指定。

hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID | IP |主机名>,...]

要么

hdfs diskbalancer -fs http://namenode.uri -report -top topnum

设置

有一组可以通过hdfs-site.xml控制的磁盘平衡器设置

设置 描述
dfs.disk.balancer.enabled 此参数控制是否为群集启用了diskbalancer。如果未启用,则datanode将拒绝任何执行命令。默认值为false。
dfs.disk.balancer.max.disk.throughputInMBperSec 这可以控制磁盘均衡器在复制数据时消耗的最大磁盘带宽。如果指定了10MB的值,那么平均而言,diskbalancer将只复制10MB / s. 默认值为10MB / s.
dfs.disk.balancer.max.disk.errors 设置两个磁盘在放弃之前的特定移动可以忽略的最大错误数的值。例如,如果计划有3对磁盘要复制,并且第一个磁盘集遇到5个以上的错误,那么我们放弃第一个副本并在计划中启动第二个副本。max errors的默认值设置为5。
dfs.disk.balancer.block.tolerance.percent 容差百分比指定我们何时达到任何复制步骤的足够好的值。例如,如果指定10%,那么接近目标值的10%就足够了。
dfs.disk.balancer.plan.threshold.percent 计划中卷数据密度的百分比阈值。如果卷数据密度的绝对值超出节点中的阈值,则意味着与磁盘对应的卷应在计划中进行平衡。默认值为10。
dfs.disk.balancer.plan.valid.interval 磁盘平衡器计划有效的最长时间。支持以下后缀(不区分大小写):ms(毫秒),s(秒),m(分钟),h(小时),d(天)以指定时间(例如2s,2m,1h等)。如果未指定后缀,则假定为毫秒。默认值为1d

调试

磁盘平衡器生成两个输出文件。nodename.before.json包含我们从namenode读取的集群状态。此文件包含有关数据节点和卷的详细信息。

如果您打算将此文件发布到apache JIRA,您可能需要替换主机名和卷路径,因为它可能会泄露您的个人信息。

您还可以调整此文件以仅关注要在JIRA中报告的节点。

nodename.plan.json包含特定节点的计划。此计划文件包含一系列步骤。步骤作为datanode内部的一系列移动操作执行。

要在节点之前和之后区分节点的状态,您可以重新运行计划命令,并使用较旧的before.json或对该节点运行报告命令来区分新的nodename.before.json。

要查看正在运行的计划的进度,请使用选项-v运行query命令。这将打印出一组步骤 - 每个步骤代表从一个磁盘到另一个磁盘的移动操作。

移动速度受指定带宽的限制。带宽的默认值设置为10MB /秒。如果使用-v选项执行查询,则会看到以下值。

  "sourcePath" : "/data/disk2/hdfs/dn",

  "destPath" : "/data/disk3/hdfs/dn",

  "workItem" :

    "startTime" : 1466575335493,

    "secondsElapsed" : 16486,

    "bytesToCopy" : 181242049353,

    "bytesCopied" : 172655116288,

    "errorCount" : 0,

    "errMsg" : null,

    "blocksCopied" : 1287,

    "maxDiskErrors" : 5,

    "tolerancePercent" : 10,

    "bandwidth" : 10

source path   - 是我们要复制的卷。

dest path - 是我们复制到的位置。

start time- 以毫秒为单位的当前时间。

seconds elapsed  - 每当我们更新统计数据时都会更新。这可能比挂钟时间慢。

bytes to copy - 我们应该复制的字节数。我们复制正负一定百分比。所以你经常会看到bytesCopied - 作为一个小于要复​​制的字节的值。在默认情况下,在移动的字节数的10%范围内被认为是足够好的。

bytes copied - 是我们从源磁盘移动到目标磁盘的实际字节数。

error count - 每次遇到错误时,我们都会增加错误计数。只要错误计数仍然小于最大错误计数(默认值为5),我们将尝试完成此移动。如果我们达到最大错误计数,我们将放弃当前步骤并执行计划中的下一步。

error message- 当前是一个报告上一条错误消息的字符串。较旧的消息应该在datanode日志中。

blocks copied - 已复制的块数。

max disk errors - 用于此移动步骤的配置。目前它将报告默认配置值,因为每个步骤控制这些值的用户界面不到位。这是一个未来的工作项目。plan命令中指定的缺省值或命令行值用于此值。

tolerance percent - 这表示在移动数据时我们可以节省多少。在一个繁忙的集群中,这允许管理员说,计算一个计划,但我知道这个节点正在使用,所以如果磁盘平衡器可以达到要复制的字节的+/- 10%就可以了。

bandwidth - 这是磁盘平衡器使用的最大聚合源磁盘带宽。移动块磁盘平衡器后,计算使用指定带宽移动该块所需的秒数。如果实际移动花费的时间少于预期,那么磁盘平衡器将在该持续时间内休眠。请注意,目前所有移动都由一个线程顺序执行。

 

 

 

 

原文链接: https://hadoop.apache.org/docs/r3.2.0/

展开阅读全文

没有更多推荐了,返回首页