
# 配置HDFS DiskBalancer磁盘均衡
#### 操作场景
DiskBalancer是一个在线磁盘均衡器，旨在根据各种指标重新平衡正在运行的DataNode上的磁盘数据。
工作方式与HDFS的Balancer工具类似，其区别如下：
- HDFS Balancer工具用于**DataNode节点间**的数据均衡。
- HDFS DiskBalancer用于**单个DataNode节点** **上**各磁盘之间的数据均衡。
长时间运行的集群会因为曾经删除过大量的文件，或者集群中的节点做磁盘扩容等操作导致节点上出现磁盘间数据不均衡的现象。磁盘间数据不均衡会引起HDFS整体并发读写性能的下降或者因为不恰当的HDFS写策略导致业务故障。此时需要平衡节点磁盘间的数据密度，防止异构的小磁盘成为该节点的性能瓶颈。
#### 约束与限制
- 本章节适用于MRS 3.x及之后版本。
- DiskBalancer磁盘均衡只支持同类型磁盘之间的数据移动，例如SSD-\>SSD，DISK-\>DISK等。
- 执行该特性会占用涉及节点的磁盘IO资源、网络带宽资源，请尽量在业务不繁忙的时候使用。
- 在集群运维过程中，排查性能类问题时，可查看集群的事件信息中是否有HDFS磁盘均衡任务事件发生，如果有，可以排查集群中是否开启了DiskBalancer。
- 自动执行磁盘均衡的特性开启以后，会在此次数据均衡执行完成之后才会退出。无法在执行均衡中途取消本次执行任务。
- 如果想要灵活选择某些指定节点进行数据均衡，可以在客户端手动指定执行。
 
#### 配置自动磁盘均衡
1. 登录FusionInsight Manager。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"。
3. 搜索以下参数名称，并根据需要修改参数值。 
   表1参数说明 
   | **参数**                                          | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | **默认值**     |
   |:---|:---|:---|
   | dfs.disk.balancer.auto.enabled                  | 是否开启自动执行HDFS DiskBalancer特性。 默认值为"false"，表示关闭该特性。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | false       |
   | dfs.disk.balancer.auto.cron.expression          | HDFS磁盘均衡操作的CRON表达式，用于控制均衡操作的开始时间。 - 仅当"dfs.disk.balancer.auto.enabled"设置为"true"时才有效。  - 默认值"0 1 \* \* 6"表示在每周六的1点执行任务。  - 表达式的具体含义可参见[表2]。   | 0 1 \* \* 6 |
   | dfs.disk.balancer.max.disk.throughputInMBperSec | 执行磁盘数据均衡时可使用的最大磁盘带宽。单位为MB/s，默认值为10，可依据集群的实际磁盘条件设置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 10          |
   | dfs.disk.balancer.max.disk.errors               | 设置能够容忍的在指定的移动过程中出现的最大错误次数，超过此阈值则移动失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 5           |
   | dfs.disk.balancer.block.tolerance.percent       | 设置磁盘之间进行数据均衡操作时，各个磁盘的数据存储量与理想状态之间的差异阈值。 - 例如，各个磁盘的理想数据存储量为1TB，此参数设置为10。那么，当目标磁盘的数据存储量达到900GB时，就认为该磁盘的存储状态就已经足够好了。  - 取值范围\[1-100\]。                                                                                                                                                                                          | 10          |
   | dfs.disk.balancer.plan.threshold.percent        | 设置在磁盘数据均衡中可容忍的两磁盘之间的数据密度阈值差。 - 如果任意两个磁盘数据密度差值的绝对值超过了此阈值，意味着对应的磁盘应该进行数据均衡。  - 取值范围\[1-100\]。                                                                                                                                                                                                                                       | 10          |
   | dfs.disk.balancer.top.nodes.number              | 该参数用来指定集群中需要执行磁盘数据均衡的Top N 节点。 返回的DataNode列表是不断重新计算的，因此不必设置的过大。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 5           |
      
   [表2]为HDFS磁盘均衡操作的CRON表达式。使用此功能时，需要先将参数"dfs.disk.balancer.auto.enabled"设置为"true"。其它参数依据集群状况设置。
    表2CRON表达式解释 
   | **列** | **说明**              |
   |:---|:---|
   | 第1列   | 分钟，参数值为0\~59。       |
   | 第2列   | 小时，参数值为0\~23。       |
   | 第3列   | 日期，参数值为1\~31。       |
   | 第4列   | 月份，参数值为1\~12。       |
   | 第5列   | 星期，参数值为0\~6，0表示星期日。 |
      
   
   
4. 单击"保存"使配置生效。无需重启HDFS服务。
 
#### 手动执行磁盘均衡
1. 安装客户端，如果已安装则跳过。 
   例如安装目录为"/opt/client"，以下操作的客户端目录只是举例，请根据实际安装目录修改。
   下载并安装集群客户端的具体操作，请参考[安装MRS集群客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   
   
2. 以客户端安装用户，登录安装客户端的节点。
3. 执行以下命令，切换到客户端安装目录，例如"/opt/client"。 
   ```
   cd /opt/client
   ```
   
   
4. 执行以下命令配置环境变量。 
   ```
   source bigdata_env
   ```
   
   
5. 如果集群为安全模式，执行以下命令进行用户认证。普通模式集群无需执行用户认证。该用户需要具备supergroup权限。 
   ```
   kinit 组件业务用户
   ```
   
   
6. 根据实际需要执行以下命令使用DiskBalancer功能： 
   表3DiskBalancer功能的接口说明 
   | 命令格式                                                    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|
   | **hdfs diskbalancer -report -top** *\<N\>*              | 查询集群中最需要执行磁盘数据均衡的Top N节点。 N可以指定为大于0的整数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | **hdfs diskbalancer -plan** *\<Hostname\| IP Address\>* | 为指定节点生成数据平衡计划，帮助优化其数据分布。 该命令可以根据传入的DataNode生成一个Json文件，该文件包含了数据移动的源磁盘、目标磁盘、待移动的块等信息。 - "Hostname"、"IP Address"：指定节点的主机名和IP地址。可以登录Manager，选择"集群 \> 服务 \> HDFS \> 实例"，查看并记录待操作DataNode节点的业务IP地址和主机名获取。  - 此外该命令还可以添加其他参数： - -threshold \<value\>（可选）：设置不平衡的阈值，超过该值的节点才会被处理。  - -bandwidth \<value\>（可选）：设置数据迁移的带宽限制，以避免影响集群性能。     |
   | **hdfs diskbalancer -query** *\<Hostname:port\>*        | 查询指定节点上运行的DiskBalancer任务的运行状态。 - "Hostname"：指定节点的主机名。可以登录Manager，选择"集群 \> 服务 \> HDFS \> 实例"，查看并记录待操作DataNode节点的主机名获取。  - "port"：DataNode IPC服务器端口。可以登录Manager，选择"集群 \> 服务 \> HDFS \> 配置 \> 全部配置"，搜索并记录"dfs.datanode.ipc.port"参数值获取，默认为9867。                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | **hdfs diskbalancer -execute** *\<planfile\>*           | 执行指定的磁盘均衡计划。 "planfile"指**hdfs diskbalancer -plan** *\<Hostname\| IP Address\>*命令中生成的Json文件，请使用绝对路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | **hdfs diskbalancer -cancel** *\<planfile\>*            | 取消正在运行的磁盘均衡计划。 "planfile"指**hdfs diskbalancer -plan** *\<Hostname\| IP Address\>*命令中生成的Json文件，请使用绝对路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | **hdfs diskbalancer -help** *\<command\>*               | 更多磁盘均衡命令的使用帮助。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
      
   
   
 
#### 相关文档
- 如果数据出现不均衡，某磁盘过满而其他磁盘未写满，请参见[非HDFS数据残留导致数据分布不均衡](https://support.huaweicloud.com/trouble-mrs/mrs_03_0091.html)。
- 如果单个节点内DataNode的各磁盘使用率不均匀，请参见[节点内DataNode磁盘使用率不均衡](https://support.huaweicloud.com/trouble-mrs/mrs_03_0093.html)。
- 如果需要均衡DataNode节点间的数据，请参见[配置HDFS DataNode数据均衡](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1667.html#mrs_01_1667)。
 
