HDFS允许管理员给私人目录设置其下面文件夹和文件的总数量配额,或空间使用总量配额。所以HDFS配额的对象是目录,而非用户。如果需要实现用户级别的配额,则需要采用第三方系统进行逻辑管理并映射到文件夹配额。
在往有配额的目录中写数据时,如果超过限额,会提示DSQuotaExceededException
异常,所以提早提醒文件夹所属的用户非常有意义。
文件数配额(Name Quota)
文件数配额指的是可以限制当前文件夹下,所有文件和文件夹的总数量(包含所有的文件夹和文件inode).类似于linux系统中ulimit里的hard limit。
空间配额(Space Quota)
空间配额指的是可以限制当前文件夹下,所有文件(包含子文件夹中的数据文件,会递归的去统计)的总大小,设置值包含副本因素,即N=fileSize * Replication
。
文件数配合空间配额可以同时使用,并不冲突。同时测试发现空间配额会有384MB物理空间(128MB逻辑空间,默认数据块大小)的固定预留,就是说当空间配额还剩下384MB时候,写文件就会失败。
设置空间配额:dfsadmin -setSpaceQuota <N> <directory>...<directory>
给每个目录设置空间配额为N Byte,N可以是5g或者2t。空间配额表示这个文件夹下所有文件的总大小,包含副本因素,即N=fileSize * Replication
。
清除空间配额:dfsadmin -clrSpaceQuota <directory>...<directory>
清除各个目录的空间配额。实际上是把空间配额设置为0。
设置配额必须由管理员来进行。
物理空间与逻辑空间
- 物理空间:文件实际占用HDFS的大小,包含副本因素,等于逻辑空间*副本数。
- 逻辑空间:文件本身大小,
du
命令显示的结果。
hdfs fsck
和hadoop fs -count
出来的CONTENT_SIZE
指的都是逻辑空间,而物理空间是逻辑空间每个文件本身的副本数,如果replication是3,则REMAINING_SPACE_QUOTA
的计算公式为:
`REMAINING_SPACE_QUOTA=SPACE_QUOTA - CONTENT_SIZE 3`
因此,空间配额限制的是物理空间,假设设置了一个文件夹的空间配额为3GB,副本数为3,那么最多可以存放总大小1GB的文件。
Storage Type Quota
在2.7版本中,可以指定一个文件夹中的Storage Type是RAM_DISK/SSD/DISK/ARCHIVE。
通过shell显示quota
显示Quota:hadoop fs -count -q -h /tmp/testquota /tmp/testquota2
实际上是调用了fs.getContentSummary()
方法,得到当前目录的ContencSummary
信息。
结果输出:
各列的含义:
通过编程设置和显示Quota
设置Quota
可以通过DistributedFileSystem.set/getQuota()
等一系列方法来设置Quota,在2.7版本中,可以分别设置namespace和storagespace的Quota,还可以StorageType Quota。
写文件超出限额具体的异常信息: