更新时间:2023-09-05 GMT+08:00

配置HDFS DataNode数据均衡

操作场景

本章节适用于MRS 3.x及后续版本。

HDFS集群可能出现DataNode节点间磁盘利用率不平衡的情况,比如集群中添加新数据节点的场景。如果HDFS出现数据不平衡的状况,可能导致多种问题,比如MapReduce应用程序无法很好地利用本地计算的优势、数据节点之间无法达到更好的网络带宽使用率或节点磁盘无法利用等等。所以MRS集群管理员需要定期检查并保持DataNode数据平衡。

HDFS提供了一个容量均衡程序Balancer。通过运行这个程序,可以使得HDFS集群达到一个平衡的状态,使各DataNode磁盘使用率与HDFS集群磁盘使用率的偏差不超过阈值。图1图2分别是Balance前后DataNode的磁盘使用率变化。

图1 执行均衡操作前DataNode的磁盘使用率
图2 执行均衡操作后DataNode的磁盘使用率

均衡操作时间估算受两个因素影响:

  1. 需要迁移的总数据量:

    每个DataNode节点的数据量应大于(平均使用率-阈值)*平均数据量,小于(平均使用率+阈值)*平均数据量。若实际数据量小于最小值或大于最大值即存在不平衡,系统选择所有DataNode节点中偏差最多的数据量作为迁移的总数据量。

  2. Balancer的迁移是按迭代(iteration)方式串行顺序处理的,每个iteration迁移数据量不超过10GB,每个iteration重新计算使用率的情况。

因此针对集群情况,可以大概估算每个iteration耗费的时间(可以通过执行Balancer的日志观察到每次iteration的时间),并用总数据量除以10GB估算任务执行时间。

由于按iteration处理,Balancer可以随时启动或者停止。

对系统的影响

  • 执行Balance操作时会占用DataNode的网络带宽资源,请根据业务需求在维护期间执行任务。
  • 默认使用带宽控制为20MB/s,如果重新设置带宽流量或加大数据量,Balance操作可能会对正在运行的业务产生影响。

前提条件

已安装HDFS客户端。

操作步骤

  1. 使用客户端安装用户登录客户端所在节点。执行命令切换到客户端安装目录,例如“/opt/client”。

    cd /opt/client

    如果集群为普通模式,需先执行su - omm切换为omm用户。

  2. 执行以下命令配置环境变量。

    source bigdata_env

  3. 如果集群为安全模式,执行以下命令认证hdfs身份。

    kinit hdfs

  4. 是否调整带宽控制?

    • 是,执行5
    • 否,执行6

  5. 执行以下命令,修改Balance的最大带宽,然后执行6

    hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>

    <bandwidth in bytes per second>表示带宽控制的数值,单位为字节。例如要设置带宽控制为20MB/s,对应值为20971520,完整命令为:

    hdfs dfsadmin -setBalancerBandwidth 20971520

    • 默认为20MB/s,适用于当前集群使用万兆网络,且有业务正在执行的场景。若没有足够的业务空闲时间窗用于Balance维护,可适当增加该值以缩短Balance时间,如增大到209715200(即200MB/s)。
    • 这个参数的调整要看组网情况,如果集群负载较高,可以改为209715200(200MB/s);如果集群空闲,可以改为1073741824 (1GB/s)。
    • 如果DataNode节点的带宽无法达到指定的最大带宽,可以在FusionInsight Manager修改HDFS的参数“dfs.datanode.balance.max.concurrent.moves”,将每个DataNode节点执行均衡的线程数修改为“32”,并重启HDFS服务。

  6. 执行以下命令,启动Balance任务。

    bash /opt/client/HDFS/hadoop/sbin/start-balancer.sh -threshold <threshold of balancer>

    -threshold表示HDFS数据达到平衡状态时DataNode磁盘使用率偏差值,各个DataNode节点磁盘的使用率和整体HDFS集群的磁盘空间平均使用率偏差小于此阈值时,系统认为HDFS集群已经达到了平衡的状态并结束Balance任务。

    例如,需要设置偏差率为5%,则执行:

    bash /opt/client/HDFS/hadoop/sbin/start-balancer.sh -threshold 5

    • 上述命令会在后台执行该任务,相关日志可以通过客户端安装目录“/opt/client/HDFS/hadoop/logs”下的hadoop-root-balancer-主机名.out查看。
    • 如果需要停止Balance任务,请执行以下命令:

      bash /opt/client/HDFS/hadoop/sbin/stop-balancer.sh

    • 如果只需要对部分节点进行数据均衡,可以在脚本上加上-include参数指定要移动的节点。具体参数使用方法,可通过命令行查看。

      例如执行:bash /opt/client/HDFS/hadoop/sbin/start-balancer.sh -threshold 5 -include IP1,IP2,IP3

    • /opt/client”为客户端安装目录,如果不一致,替换即可。
    • 如果该命令执行失败,在日志中看到的错误信息为“Failed to APPEND_FILE /system/balancer.id”,则需要执行如下命令强行删除“/system/balancer.id”,再次执行start-balancer.sh脚本即可。

      hdfs dfs -rm -f /system/balancer.id

  7. 用户在执行了6的脚本后,会在客户端安装目录“/opt/client/HDFS/hadoop/logs”目录下生成名为hadoop-root-balancer-主机名.out日志。打开该日志可以看到如下字段信息:

    • Time Stamp:时间戳
    • Bytes Already Moved:已经移动的字节数
    • Bytes Left To Move:待移动的字节数
    • Bytes Being Moved:正在移动的字节数

    日志出现“Balancing took xxx seconds”信息表示均衡操作已完成。

相关任务

设置自动执行Balance任务

  1. 登录FusionInsight Manager。
  2. 选择“集群 > 待操作集群的名称 > 服务 > HDFS > 配置”,选择“全部配置”,搜索以下参数名并修改参数值。

    • “dfs.balancer.auto.enable”表示是否启用自动执行Balance任务,默认值为“false”表示不启用,修改为“true”表示启用。
    • “dfs.balancer.auto.cron.expression”表示任务执行的时间,默认值“0 1 * * 6”表示在每周六的1点执行任务。仅在启用自动执行Balance功能时有效。

      修改此参数时,表达式介绍如表1所示。支持“*”表示连续的时间段。

      表1 执行表达式参数解释

      说明

      第1列

      分钟,参数值为0~59。

      第2列

      小时,参数值为0~23。

      第3列

      日期,参数值为1~31。

      第4列

      月份,参数值为1~12。

      第5列

      星期,参数值为0~6,0表示星期日。

    • “dfs.balancer.auto.stop.cron.expression”表示任务自动停止的时间,默认值为空,表示不自动停止正在运行的Balancer任务。以“0 5 * * 6”为例,则表示在每周六的5点停止正在运行的Balancer任务。仅在启用自动执行Balance功能时有效。

      修改此参数时,表达式介绍如表1所示。支持“*”表示连续的时间段。

  3. 修改自动Balancer的运行参数,如表2所示:

    表2 自动Balancer运行参数

    参数名

    参数介绍

    默认值

    dfs.balancer.auto.threshold

    表示磁盘容量百分比的均衡阈值。仅当dfs.balancer.auto.enable设置为true时才有效。

    10

    dfs.balancer.auto.exclude.datanodes

    不需要执行磁盘自动均衡的DataNode列表,用逗号分隔。仅当dfs.balancer.auto.enable设置为true时才有效。

    默认为空

    dfs.balancer.auto.bandwidthPerSec

    每个DataNode可用于负载均衡的最大带宽量(单位:MB/s)。

    20

    dfs.balancer.auto.maxIdleIterations

    Balancer的最大连续空闲迭代次数。一次空闲迭代为没有Block块被移动的迭代,当连续空闲迭代次数达到最大连续空闲迭代次数时,本次Balancer结束。当取值为-1时,代表无穷大。

    5

    dfs.balancer.auto.maxDataNodesNum

    该参数用来控制进行自动Balancer的DataNode数量。假设该参数值为N,当N大于0, 则选择剩余空间比例最高的N个DataNode和最低的N个DataNode之间进行数据均衡;当N等于0, 则对集群中所有DataNode进行数据均衡。

    5

  4. 单击“保存”使配置生效。无需重启HDFS服务。

    任务执行日志保存在主NameNode节点中,请查看“/var/log/Bigdata/hdfs/nn/hadoop-omm-balancer-主机名.log”。