Diskbalancer是一个命令行工具,可将数据均匀分布在datanode的所有磁盘上。此工具不同于 Balancer ,后者负责整个群集范围内的数据平衡。由于多种原因,数据在节点上的磁盘之间分布不均匀。这可能是由于大量的写入和删除操作或由于更换了磁盘而发生的。该工具针对给定的datanode进行操作,并将块从一个磁盘移动到另一个磁盘。
Disk Balancer通过创建计划进行操作,然后继续在数据节点上执行该计划。计划是一组语句,描述了两个磁盘之间应移动多少数据。计划由多个移动步骤组成。移动步骤具有源磁盘,目标磁盘和要移动的字节数。可以针对操作数据节点执行计划。磁盘平衡器不应限制其他进程,因为它可以限制每秒复制多少数据。请注意,默认情况下,群集上未启用磁盘平衡器。要启用diskbalancer,必须在hdfs-site.xml 中将dfs.disk.balancer.enabled设置为true。
以下各节讨论磁盘平衡器支持哪些命令以及如何使用它们。
通过运行,可以针对给定的datanode运行plan命令
hdfs diskbalancer -plan node1.mycluster.com
该命令接受通用选项。
plan命令还具有一组参数,允许用户控制计划的输出和执行。
COMMAND_OPTION | 描述 |
---|---|
出 | 允许用户控制计划文件的输出位置。 |
-带宽 | 由于datanode处于运行状态并且可能正在运行其他作业,因此diskbalancer会限制每秒移动的数据量。该参数允许用户设置要使用的最大带宽。不需要设置此项,因为如果未指定,则diskBalancer将使用默认带宽。 |
-thresholdPercentage | 由于我们针对datanode的快照进行操作,因此move操作具有一定的容差百分比来声明成功。如果用户指定10%,并且移动操作的大小为20GB,那么如果我们可以移动18GB,则该操作被视为成功。这是为了实时适应datanode中的更改。不需要此参数,如果未指定,则使用默认值。 |
-maxerror | 最大错误允许用户指定在中止移动步骤之前必须完成多少个块复制操作。再一次,这不是必需的参数,如果未指定,则使用系统默认值。 |
-v | 详细模式,指定此参数将强制plan命令在stdout上打印出计划摘要。 |
-fs | -指定要使用的名称节点。如果未指定,则使用config中的默认值。 |
该计划命令写入两个输出文件。他们是<节点名> .before.json在运行之前diskbalancer其捕获群集的状态,并<节点名> .plan.json。
Execute命令采用计划命令,针对生成计划的数据节点执行该命令。
hdfs diskbalancer-执行/system/diskbalancer/nodename.plan.json
这通过从计划文件中读取datanode的地址来执行计划。当DiskBalancer执行该计划时,这是一个异步过程的开始,可能需要很长时间。因此,查询命令可以帮助获取执行命令的当前状态。
COMMAND_OPTION | 描述 |
---|---|
-skipDateCheck | 跳过日期检查并强制执行计划。 |
查询命令从数据节点获取磁盘平衡器的当前状态。
hdfs diskbalancer-查询nodename.mycluster.com
COMMAND_OPTION | 描述 |
---|---|
-v | 详细模式,打印出单个动作的状态 |
有一组磁盘平衡器设置,可以通过hdfs-site.xml进行控制
设置 | 描述 |
---|---|
dfs.disk.balancer.enabled | 此参数控制是否为集群启用了diskbalancer。如果未启用,则任何执行命令都会被datanode拒绝。默认值为false。 |
dfs.disk.balancer.max.disk.throughputInMBperSec | 这样可以控制diskbalancer在复制数据时消耗的最大磁盘带宽。如果指定了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。 |
dfs.disk.balancer.plan.valid.interval | 磁盘平衡器计划的最大有效时间。支持以下后缀(不区分大小写):ms(millis),s(sec),m(min),h(hour),d(day)以指定时间(例如2s,2m,1h等)。如果未指定后缀,则假定为毫秒。默认值为1d |
磁盘平衡器生成两个输出文件。nodename.before.json包含我们从namenode读取的集群状态。该文件包含有关数据节点和卷的详细信息。
如果计划将此文件发布到apache JIRA,则可能要替换您的主机名和卷路径,因为它可能会泄漏您的个人信息。
您还可以缩小此文件以仅关注要在JIRA中报告的节点。
nodename.plan.json包含特定节点的计划。该计划文件包含一系列步骤。步骤被执行为datanode内部的一系列移动操作。
要区分节点之前和之后的状态,可以重新运行计划命令,然后将新的nodename.before.json与较早的before.json进行区分,或者对节点运行report命令。
要查看运行计划的进度,请运行带有选项-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, “带宽”:10
源路径 -是我们要从中复制的卷。
目标路径 -是我们要复制到的卷。
开始时间 -是当前时间(以毫秒为单位)。
经过的秒数 -每当我们更新统计信息时都会更新。这可能比挂钟时间慢。
要复制的字节数-是我们应该复制的字节数。我们复制正负一定的百分比。因此,通常您会看到bytesCopied –比复制的字节还小的值。在默认情况下,认为在10%的字节内移动就足够了。
复制的字节数-是我们从源磁盘移到目标磁盘的实际字节数。
错误计数 -每次遇到错误时,我们都会增加错误计数。只要错误计数保持小于最大错误计数(默认值为5),我们将尝试完成此步骤。如果达到最大错误计数,我们将放弃此当前步骤并执行计划中的下一步。
错误消息 -当前报告最后一条错误消息的单个字符串。较旧的消息应位于datanode日志中。
复制的块数-复制的块数。
最大磁盘错误数 -用于此移动步骤的配置。当前,它将报告默认配置值,因为没有用于控制每个步骤的这些值的用户界面。这是未来的工作项目。在计划命令中指定的默认值或命令行值用于此值。
容差百分比 -表示我们在移动数据时可以节省多少。在繁忙的集群中,这允许管理员说出一个计划,但是我知道正在使用此节点,因此磁盘平衡器可以达到要复制的字节的+/- 10%可以。
带宽 -这是磁盘平衡器使用的最大源磁盘总带宽。移动块后,磁盘平衡器将计算以指定带宽移动该块应花费的秒数。如果实际移动所花费的时间少于预期的时间,则磁盘平衡器将在该时间内休眠。请注意,当前所有移动均由单个线程顺序执行。