本文为您介绍在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>为设置的最大带宽,例如,如果需要设置带宽控制为20 MB/s,对应值为20971520,则完整代码示例为hdfs dfsadmin -setBalancerBandwidth 20971520。如果集群负载较高,可以改为209715200(200 MB/s);如果集群空闲,可以改为1073741824(1 GB/s)。
    3. 执行以下命令,切换到hdfs用户并执行Balancer参数。
      su hdfs
      /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 10
    4. 执行以下命令,进入HDFS安装目录。
      cd /var/log/emr/hadoop/
    5. 执行ll命令,查看Balancer日志。
    6. 执行以下命令,查看Balancer运行情况。
      tailf hadoop-hdfs-balancer-master-1-1.c-xxx.log
      说明 命令中的hadoop-hdfs-balancer-master-1-1.c-xxx为前面步骤中获取到的日志名称。

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