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

背景信息

配置回收站机制

  • 背景:在HDFS中,删除的文件将被移动到回收站(trash)中,以便在误操作的情况下恢复被删除的数据。

    您可以设置文件保留在回收站中的时间阈值,一旦文件保存时间超过此阈值,系统将自动从回收站中永久地删除该文件。您也可以手动删除回收站里面的文件。

  • 建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数fs.trash.interval,参数描述如下表。trash
    参数 描述 默认值
    fs.trash.interval 以分钟为单位的垃圾回收时间,垃圾站中数据超过此时间会被删除。

    如果设置为0,表示禁用回收站机制。

    1440
    说明 建议您使用默认值,以便于在误操作的情况下恢复被删除的文件。不建议您将此参数设置过大,避免回收站中过多的文件占用集群的可用空间。

控制小文件个数

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

配置HDFS单目录文件数量

  • 背景:当集群运行时,不同组件(例如Spark和YARN)或客户端可能会向同一个HDFS目录不断写入文件。但HDFS系统支持的单目录文件数目是有上限的,因此需要您提前做好规划,防止单个目录下的文件数目超过阈值,导致任务出错。
  • 建议:您可以在EMR控制台HDFS服务的配置页面,单击hdfs-site页签,然后单击自定义配置,新增参数dfs.namenode.fs-limits.max-directory-items,以设置单个目录下可以存储的文件数目,最后保存配置。添加参数详情,请参见添加组件参数
    说明 您需要将数据做好存储规划,可以按时间、业务类型等分类,不要单个目录下直属的文件过多,建议单个目录下约100万条。

在网络不稳定的情况下,降低客户端运行异常概率

  • 背景:在网络不稳定的情况下,调整ipc.client.connect.max.retries.on.timeoutsipc.client.connect.timeout参数,适当提高客户端的重试次数和超时时间,可以降低客户端运行异常的概率。
  • 建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数ipc.client.connect.max.retries.on.timeouts,您可以增大该参数值,增加连接的最大重试次数。在配置搜索区域,搜索参数ipc.client.connect.timeout,您可以增大该参数值,增加建立连接的超时时间。
    参数 描述 默认值
    ipc.client.connect.max.retries.on.timeouts 客户端同服务端建立Socket连接时,客户端的最大重试次数。 45
    ipc.client.connect.timeout 客户端与服务端建立Socket连接的超时时间。

    单位:毫秒。

    20000

配置可容忍的磁盘坏卷

  • 背景:如果为DataNode配置多个数据存放卷,默认情况下其中一个卷损坏,则DataNode将不再提供服务。
  • 建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数dfs.datanode.failed.volumes.tolerated,您可以修改此参数,指定失败的个数,小于该个数,DataNode可以继续提供服务。
    参数 描述 默认值
    dfs.datanode.failed.volumes.tolerated DataNode停止提供服务前允许失败的卷数。默认情况下,必须至少有一个有效卷。 0
    说明 当DataNode存在坏盘,而又没有其他足够的节点可以提供服务时,可以临时将该值调大,先将DataNode启动起来。

防止目录被误删

  • 背景:HDFS允许将一些目录配置为受保护的,避免这些目录被误删除,但是依然可以将目录挪到回收站。
  • 建议:您可以在EMR控制台HDFS服务的配置页面,单击core-site页签,然后单击自定义配置,新增参数fs.protected.directories,参数值为您待保护的目录,多个目录时使用逗号(,)分隔,并保存配置。delete

使用Balancer进行容量均衡

  • 背景:HDFS集群可能出现DataNode节点间磁盘利用率不平衡的情况,例如集群中添加新DataNode的场景。如果HDFS出现数据不平衡的状况,则可能导致个别DataNode压力过大。
  • 建议:您可以使用Balancer操作进行容量均衡。
    说明 执行Balancer操作时会占用DataNode的网络带宽资源,请根据业务需求在业务空闲时期执行Balancer任务。
    1. 登录待配置集群任意节点。

      本示例登录Master节点,详情请参见登录集群

    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
      /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 10
    4. 执行以下命令,进入hadoop-hdfs目录。
      cd /var/log/hadoop-hdfs
    5. 执行ll命令,查看Balancer日志。
      返回信息类似如下截图。balancer
    6. 执行以下命令,查看Balancer运行情况。
      tailf /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
      当提示信息包含Successfully字样时,表示执行成功。
      说明 代码中的hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log为前面步骤中获取到的日志名称。