当您的集群因大量的写入和删除,或者由于磁盘更换和扩容等操作,导致数据在节点上的磁盘之间分布不均匀,引起HDFS并发读写性能的下降等问题时,可通过HDFS Diskbalancer将数据均匀地分布在DataNode的所有磁盘上。本文为您介绍HDFS DiskBalancer的使用方法以及主要调优参数。

背景信息

HDFS Diskbalancer是Hadoop 3.x提供的一个命令行工具,可以将数据均匀地分布在DataNode的所有磁盘上。不同于HDFS Balancer,HDFS Balancer负责集群范围内的数据平衡,HDFS Diskbalancer工具是对给定的DataNode进行操作,将块从一个磁盘移动到另一个磁盘。

HDFS Diskbalancer的操作方式是创建一个计划(plan),然后在DataNode执行该计划。计划是描述两个磁盘之间应该移动多少数据的一组语句。一个计划是由多个步骤组成的。移动步骤有源磁盘、目标磁盘和要移动的字节数。计划可以针对操作数据节点执行。磁盘平衡器通过限制每秒复制的数据量防止干扰其他进程。

使用HDFS DiskBalancer

HDFS DiskBalancer命令语句如下。
hdfs diskbalancer -help <command>.
    --help <arg> valid commands are plan | execute | query | cancel |
                   report

plan

通过指定一个DataNode执行DiskBalancer。
hdfs diskbalancer -plan <hostname> [options]
示例:
hdfs diskbalancer -plan core-1-1.c-xxxxxxxxxxx
命令选项 描述
-bandwidth <arg> DiskBalancer可使用的最大磁盘带宽(MB/s),为整数。例如10 MB/s。
-maxerror <arg> 描述在一对磁盘之间进行复制时可容忍的错误数。
-out <arg> 要写入输出的文件的本地路径,如果未指定,将使用默认值。
-thresholdPercentage <arg> 磁盘平衡器开始工作前允许的数据倾斜百分比。例如,如果一个2盘节点上的总数据为100 GB,那么磁盘均衡器计算每个磁盘上的期望值为50 GB。如果容差为10%,则单个磁盘上的数据需要大于60 GB(50 GB + 10%容差值),DiskBalancer才能开始工作。
-v 详细模式,指定此参数将强制plan命令在标准输出上打印计划的摘要。

execute

通过指定一个plan命令生成的planfile,执行DiskBalancer。
hdfs diskbalancer -execute <planfile>
示例:
hdfs diskbalancer -execute /system/diskbalancer/core-1-1.c-xxxxxxxxxxx.plan.json
命令选项 描述
-skipDateCheck 跳过日期检查并强制执行计划。

query

查询指定DataNode关于磁盘均衡器执行的当前状态。
hdfs diskbalancer -query <hostname>  [options]
示例:
hdfs diskbalancer -query core-1-1.c-xxxxxxxxxxx
命令选项 描述
-v 打印正在节点上执行的计划的详细信息。

cancel

取消正在运行的计划,与重新启动DataNode的效果相同。
hdfs diskbalancer -cancel <planFile> | -cancel <planID> -node <hostname>
示例:
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
或者
hdfs diskbalancer -cancel planID -node nodename
说明 planID可以通过query命令从DataNode中读取。
命令选项 描述
-node <arg> 取消正在执行的使用planID和主机名运行的计划。

report

report命令提供指定节点或将从运行磁盘均衡器中受益的Top节点的详细报告。节点可以通过一个主机列表文件或以逗号分隔的节点列表指定。
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
或者
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
命令选项 描述
-node <arg> DataNode地址,可以为DataNode ID、IP或者hostname。
-top <arg> 指定要列出的数据不平衡的节点数量。

HDFS DiskBalancer调优参数

当需要对DiskBalancer参数进行调整时,您可以在E-MapReduce控制台的HDFS服务页面,选择配置 > hdfs-site.xml,新增或调整以下配置。
参数 描述
dfs.disk.balancer.enabled 是否开启HDFS DiskBalancer特性。默认为true。
dfs.disk.balancer.max.disk.throughputInMBperSec 执行DiskBalancer时可使用的最大磁盘带宽。单位为MB/s,默认为10。
dfs.disk.balancer.max.disk.errors 设置能够容忍的在指定的移动过程中出现的最大错误次数,超过此阈值则失败。默认为5。
dfs.disk.balancer.plan.valid.interval DiskBalancer计划的最长有效时间。默认为1d。
dfs.disk.balancer.block.tolerance.percent 设置磁盘之间进行数据均衡操作时,各个磁盘的数据存储量与理想状态之间的差异阈值。取值范围[1-100],默认为10。例如,各个磁盘的理想数据存储量为100 GB,此参数设置为10。那么,当目标磁盘的数据存储量达到90 GB时,则认为该磁盘的存储状态就已经达到预期。
dfs.disk.balancer.plan.threshold.percent 设置在磁盘数据均衡中可容忍的两磁盘之间的数据密度域值差,取值范围[1-100],默认为10。如果任意两个磁盘数据密度差值的绝对值超过了阈值,则说明需要对该的磁盘进行数据均衡。例如,如果一个2盘节点上的总数据为100 GB,那么磁盘均衡器计算每个磁盘上的期望值为50 GB。如果容差为10%,则单个磁盘上的数据需要大于60 GB(50 GB + 10%容差值),DiskBalancer才能开始工作。