HDFS配额Quota

概述

Hadoop分布式文件系统(HDFS)允许管理员为所使用的名称数量和单个目录使用的空间量设置配额。name quota和space quota独立运作,但这两种配额的管理和实施是相当类似的。

name quota

name quota是对当前目录树中的文件和目录名称的数量的硬限制。如果超出配额,文件和目录创建将会失败。配额与重新命名目录操作绑定;如果操作会导致配额违规,重命名操作将失败。即使目录违反新的配额,设置配额的尝试仍然会成功。新创建的目录没有关联的配额。最大的配额是Long.Max_Value。只等于1的配额会强制一个目录保持为空。 (是的,一个目录也占用配额!)

配额持久化在fsimage中,当集群启动时,如果fsimage中有违反配额的目录(可能是FsImage文件被偷偷地修改了),将会打印出一个warning。设置或者移除配额配置会创建日志条目。

space quota

space quota是该目录树中的文件使用的字节数量的硬限制。如果配额不允许写入完整的块,则块分配失败。一个区块的每个副本都会计入配额。配额重新命名目录;如果操作将导致配额违规,重命名操作将失败。新创建的目录没有关联的配额。最大的配额是Long.Max_Value。零配额仍允许创建文件,但不能将任何块添加到文件中。目录不使用主机文件系统空间,不要计入space quota。用于保存文件元数据的主机文件系统空间不计入配额。配额按照该文件的预期复制因子收费;更改文件的复制因子将会记入或扣除配额。

配额持久化在fsimage中。当集群启动时,如果fsimage中有违反配额的目录(可能是FsImage文件被偷偷地修改了),将会打印出一个warning。设置或者移除配额配置会创建日志条目。

管理员命令

配额由一组仅供管理员使用的命令管理。

#dfsadmin -setQuota <N> <directory> ... <directory>

为每个目录设置name quota为N。每个目录的最大效果,如果N不是长整型,该目录不存在或者它是一个文件,或该目录将立即超出新的配额,则报告错误。

dfsadmin -clrQuota <directory> ... <directory>

删除每个目录的任何name quota。每个目录的最佳努力,如果该目录不存在或者是一个文件报告错误。如果目录没有配额,这不是故障。

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

将SpaceQuota设置为每个目录的N个字节。这是目录树下所有文件的总大小的一个硬限制。SpaceQuota也把副本算在内,即1GB的数据副本消耗3GB的配额。为了方便,也可以用二进制前缀指定N。 50g为50GB,2t为2TB等等。每个目录的最佳效果,如果N不是零,也不是长整型,那么目录不存在或者是一个文件,或者该目录将立即超出新的配额。

dfsadmin -clrSpaceQuota <directory> ... <director>

删除每个目录的任何SpaceQuota。每个目录的最佳努力,如果该目录不存在或者是一个文件报告错误。如果目录没有配额,这不是故障。

Report命令

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

fs -count -q <directory> ... <directory>

使用-q选项,还会报告为每个目录设置的name quota值,剩余的可用name quota,设置的SpaceQuota值和剩余的可用SpaceQuota。如果目录没有配额设置,则报告的值为none和inf。

操作实例

设置文件数配额

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

例如:设置目录下的文件总数为1000个hdfs dfsadmin -setQuota 1000 /p/work

清除配额

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

设置空间配额

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

例如:hdfs dfsadmin -setSpaceQuota 9T /p/work

设置目录大小为9T,算上副本,也就是存3T的数据

清除目录大小配额

#dfsadmin -clrSpaceQuota <directory>...<director>

查看目录占用情况


注意:一旦达到配额,即使文件上传不成功,也占用一定的配额,必须清除一些文件目录才能使用

1Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.DSQuotaExceededException): The DiskSpace quotaof /user/caixiaoyuis exceeded: quota= 21474836480 B = 20 GB but diskspace consumed = 21530402406 B = 20.05 GB

注意:并不是删除0.05GB数据就可以继续使用,20.05GB只是超出20G的一个临界点,并不是说数据写入成功后就占用那么大,最好不要达到临界值


hdfs dfs -put的文件上传超出配额,用hdfs dfs -du 统计不占用空间,但是占用配额,再上传小文件会出错

用spark  api写入的文件,超出配额会在目标目录下生成temp目录,但不是有效数据的一部分

来源:http://cxy7.com/articles/2017/06/28/1498655025173.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。