HDFS使用优化

更新时间:
复制 MD 格式

本文为您介绍在E-MapReduce(简称EMR)上使用HDFS进行场景化配置的一些建议,以便优化HDFS的使用性能或稳定性等。

背景信息

控制小文件个数

  • 背景:HDFS NameNode将所有文件元数据加载在内存中,在集群磁盘容量一定的情况下,如果小文件个数过多,则会造成NameNode的内存容量瓶颈。

  • 建议:尽量控制小文件的个数。对于存量的小文件,建议合并为大文件。

配置HDFS单目录文件数量

  • 背景:当集群运行时,不同组件(例如SparkYARN)或客户端可能会向同一个HDFS目录不断写入文件。但HDFS系统支持的单目录文件数目是有上限的,因此需要您提前做好规划,防止单个目录下的文件数目超过阈值,导致任务出错。

  • 建议:您可以在EMR控制台HDFS服务的配置页面,单击hdfs-site页签,然后单击新增配置项,新增参数dfs.namenode.fs-limits.max-directory-items,以设置单个目录下可以存储的文件数目,最后保存配置。添加参数详情,请参见管理配置项

    说明

    您需要将数据做好存储规划,可以按时间、业务类型等分类,单个目录下直属的文件不要过多,建议单个目录下约100万条。

配置可容忍的磁盘坏卷

  • 背景:如果为DataNode配置多个数据存放卷,默认情况下必须至少有一个有效卷,其中一个卷损坏,则DataNode将不再提供服务。

  • 建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数dfs.datanode.failed.volumes.tolerated,您可以修改此参数。小于该参数值,DataNode可以继续提供服务。

    参数

    描述

    默认值

    dfs.datanode.failed.volumes.tolerated

    DataNode停止提供服务前允许失败的卷数。

    0

    说明

    DataNode存在坏盘,而又没有其他足够的节点可以提供服务时,可以临时将该值调大,先将DataNode启动起来。

使用Balancer进行容量均衡

  • 背景:HDFS集群可能出现DataNode节点间磁盘利用率不平衡的情况,例如集群中添加新DataNode的场景。如果HDFS出现数据不平衡的状况,则可能导致个别DataNode压力过大。

  • 建议:您可以使用Balancer操作进行容量均衡。

    说明

    执行Balancer操作时会占用DataNode的网络带宽资源,请根据业务需求在业务空闲时期执行Balancer任务。

    1. 登录待配置集群的任意节点。

    2. 可选:执行以下命令,修改Balancer的最大带宽。

      hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>
      说明

      示例中的<bandwidth in bytes per second>为设置的最大带宽,例如,如果需要设置带宽控制为200 MB/s,对应值为200 * 1024 * 1024B,即209715200字节,则完整代码示例为hdfs dfsadmin -setBalancerBandwidth 209715200。如果集群负载较高,为了缓解网络压力,应该将带宽限制降低,可以改为20971520(20 MB/s);如果集群空闲,为了加速数据均衡过程,建议将带宽限制提高,可以改为1073741824(1 GB/s)。

    3. 执行以下命令,切换到hdfs用户并执行Balancer参数。

      su hdfs
      /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 10
    4. 执行以下命令,查看Balancer日志。

      tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log
      说明

      命令中的hadoop-hdfs-balancer-master-1-1.c-xxx为前面步骤中获取到的日志名称。

当提示信息包含Successfully字样时,表示执行成功。

多磁盘规格 DataNode 均衡配置

  • 背景:当集群中存在不同磁盘规格的 DataNode 节点组时(例如节点组之间单盘容量不同或挂载磁盘数量不同),Balancer 按各 DataNode 的磁盘使用率百分比进行均衡,因此均衡完成后各节点组的使用率趋于一致,但不同规格节点组之间的 HDFS 绝对可用容量差异依然存在。

  • 建议:可以为不同节点组分别设置dfs.datanode.du.reserved参数值(该参数表示每块磁盘上为非 HDFS 用途预留、不参与 HDFS 存储的空间),使各节点组的 HDFS 可用磁盘容量保持一致。

    参数

    描述

    默认值

    dfs.datanode.du.reserved

    每块磁盘为非 HDFS 用途预留的空间,该部分空间不计入 HDFS 可用容量。单位为字节。

    1073741824(即 1 GB)

    说明

    该参数支持节点组级别配置(配置范围可选择节点组),因此可以对不同磁盘规格的节点组分别取值。

    计算公式:

    单个 DataNode 的 HDFS 可用磁盘空间 = (单盘容量 - dfs.datanode.du.reserved) × 磁盘数量

    例如,A 节点组每个节点挂载 4 块 1200 GB 磁盘,将 dfs.datanode.du.reserved 设置为 380 GB;B 节点组每个节点挂载 8 块 7300 GB 磁盘,将 dfs.datanode.du.reserved 设置为 6890 GB。此时两个节点组的单节点 HDFS 可用磁盘空间均为 3280 GB:

    • A 节点组:(1200 - 380) × 4 = 3280 GB

    • B 节点组:(7300 - 6890) × 8 = 3280 GB

    操作步骤:

    1. 登录 EMR on ECS 控制台,在待配置集群的 HDFS 服务的配置页面,在配置搜索区域,搜索参数dfs.datanode.du.reserved

    2. 将配置范围切换为目标节点组,按上述公式填入该节点组对应的取值。

    3. 对每个磁盘规格不同的节点组重复上一步,保存配置。

    4. 重启 HDFS 服务使配置生效。

    5. 在 HDFS Web UI 查看各 DataNode 的容量是否已经一致。若各 DataNode 容量已一致但数据分布仍不均,可执行上一章节介绍的 Balancer 操作完成数据均衡。

    说明

    参数值需按字节填写,示例中的 GB 数值需换算为对应字节数;设置时应确保(单盘容量 - 预留值)为正值,并为操作系统与日志等非 HDFS 用途留出合理空间。