HDFS 配额指南

概述

Hadoop 分布式文件系统 (HDFS) 允许管理员为各个目录中使用的名称数量和空间用量设置配额。名称配额和空间配额独立运作,但两种配额的管理和实施非常相似。

名称配额

名称配额是对该目录根目录下的文件和目录名称数量的硬性限制。如果超过配额,则文件和目录创建将失败。配额与重命名的目录保持一致;如果操作会导致配额违规,则重命名操作将失败。即使目录违反新配额,设置配额的尝试仍会成功。新创建的目录没有关联的配额。最大的配额是 Long.Max_Value。配额为 1 会强制目录保持为空。(是的,目录会算入自己的配额!)

配额与 fsimage 持久化。启动时,如果 fsimage 立即违反配额(可能是 fsimage 被秘密修改),则会为每个此类违规打印警告。设置或移除配额会创建日志条目。

空间配额

空间配额是对该目录根目录下的文件所使用的字节数的硬限制。如果配额不允许写入完整块,则块分配将失败。每个块的副本都计入配额。配额与重命名的目录保持一致;如果操作会导致配额违规,则重命名操作将失败。新创建的目录没有关联的配额。最大的配额是 Long.Max_Value。零配额仍然允许创建文件,但不能向文件添加任何块。目录不使用主机文件系统空间,也不计入空间配额。用于保存文件元数据的主机文件系统空间不计入配额。配额按文件的预期复制因子收取;更改文件的复制因子将贷记或借记配额。

配额与 fsimage 持久化。启动时,如果 fsimage 立即违反配额(可能是 fsimage 被秘密修改),则会为每个此类违规打印警告。设置或移除配额会创建日志条目。

存储类型配额

存储类型配额是对目录根目录下的文件使用特定存储类型(SSD、DISK、ARCHIVE)的硬限制。它在许多方面与存储空间配额类似,但可以精细地控制群集存储空间的使用。要在目录上设置存储类型配额,必须在目录上配置存储策略,以便允许根据存储策略将文件存储在不同的存储类型中。有关更多信息,请参阅HDFS 存储策略文档

存储类型配额可以与空间配额和名称配额结合使用,以有效地管理群集存储使用。例如,

  1. 对于配置了存储策略的目录,管理员应为资源约束存储类型(如 SSD)设置存储类型配额,并为其他存储类型和整体空间配额保留配额,这些配额的值较低或默认情况下不受限制。HDFS 将根据存储策略和整体空间配额从目标存储类型中扣除配额。
  2. 对于未配置存储策略的目录,管理员不应配置存储类型配额。即使特定存储类型不可用(或可用但未正确配置存储类型信息),也可以配置存储类型配额。但是,在这种情况下建议使用整体空间配额,因为存储类型信息对于存储类型配额强制执行不可用或不准确。
  3. DISK 上的存储类型配额用途有限,除非 DISK 不是主要的存储介质。(例如,主要使用 ARCHIVE 存储的群集)。

管理命令

配额由一组仅对管理员可用的命令管理。

  • hdfs dfsadmin -setQuota <N> <directory>...<directory>

    将名称配额设置为每个目录的 N。尽最大努力为每个目录,如果 N 不是正长整数、目录不存在或它是文件,或者目录将立即超过新配额,则报告错误。

  • hdfs dfsadmin -clrQuota <directory>...<directory>

    删除每个目录的任何名称配额。尽力处理每个目录,如果目录不存在或它是一个文件,则报告错误。如果目录没有配额,则不是错误。

  • hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>

    将每个目录的空间配额设置为 N 字节。这是目录树下所有文件总大小的硬限制。空间配额也考虑了副本,即,具有 3 个副本的 1 GB 数据消耗 3GB 配额。N 还可以用二进制前缀指定以方便使用,例如,50g 表示 50 千兆字节,2t 表示 2 太字节等。尽力处理每个目录,如果 N 既不是零也不是正整数,目录不存在或它是一个文件,或者目录将立即超过新配额,则报告错误。

  • hdfs dfsadmin -clrSpaceQuota <directory>...<directory>

    删除每个目录的任何空间配额。尽力处理每个目录,如果目录不存在或它是一个文件,则报告错误。如果目录没有配额,则不是错误。

  • hdfs dfsadmin -setSpaceQuota <N> -storageType <storagetype> <directory>...<directory>

    将存储类型配额设置为每个目录指定的 N 字节存储类型。这是目录树下所有文件总存储类型使用的硬限制。存储类型配额使用反映基于存储策略的预期使用情况。例如,具有 3 个副本和 ALL_SSD 存储策略的 1 GB 数据消耗 3GB SSD 配额。N 还可以用二进制前缀指定以方便使用,例如,50g 表示 50 千兆字节,2t 表示 2 太字节等。尽力处理每个目录,如果 N 既不是零也不是正整数,目录不存在或它是一个文件,或者目录将立即超过新配额,则报告错误。当指定 -storageType 选项时,将设置特定于存储类型的配额。可用的存储类型有 DISK、SSD、ARCHIVE、PROVIDED。

  • hdfs dfsadmin -clrSpaceQuota -storageType <storagetype> <directory>...<directory>

    移除为每个目录指定的存储类型配额。尽最大努力处理每个目录,如果目录不存在或它是一个文件,则报告错误。如果目录没有为指定的存储类型启用存储类型配额,则这不是错误。当指定 -storageType 选项时,将清除特定于存储类型的配额。可用的存储类型包括 DISK、SSD、ARCHIVE、PROVIDED。

报告命令

作为 HDFS shell 的 count 命令的扩展,它报告配额值以及当前正在使用的名称和字节数。

  • hadoop fs -count -q [-h] [-v] [-t [逗号分隔的存储类型列表]] <directory>...<directory>

    使用 -q 选项,还可以报告为每个目录设置的名称配额值、剩余的可用名称配额、设置的空间配额值以及剩余的可用空间配额。如果目录没有设置配额,则报告的值为 noneinf。-h 选项以人类可读的格式显示大小。-v 选项显示标题行。-t 选项显示每个目录的每个存储类型的配额设置以及剩余的可用配额。如果在 -t 选项后给出了特定的存储类型,则只显示指定类型的配额和剩余配额。否则,将显示支持配额的所有存储类型的配额和剩余配额。