HDFS使用优化

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

背景信息

控制小文件个数

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

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

配置HDFS单目录文件数量

  • 背景:当集群运行时,不同组件(例如Spark和YARN)或客户端可能会向同一个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字样时,表示执行成功。