在HDFS中,管理员可以通过为每一个目录设置一定名称和空间上的配额。名称配额和空间配额可以单独设置,但是从管理上和实现上,这两种配额接近平行。 名称配额(name quota) 是在该目录下所有文件和目录名称的数量上的硬限制。当超过这个配额设置时,文件或目

在HDFS中,管理员可以通过为每一个目录设置一定名称和空间上的配额。名称配额和空间配额可以单独设置,但是从管理上和实现上,这两种配额接近平行。
名称配额(name quota)是在该目录下所有文件和目录名称的数量上的硬限制。当超过这个配额设置时,文件或目录就会创建失败。重命名后命名配额仍然起作用。如果重命名操作违反配额的限制,那么重命名会失败。新建的目录不会有任何配额设置。名字配额的上限是Long.Max_Value,如果配额为1那么这个目录会强制为空,因为目录自身也会占用1个配额。配额的设置被持久化在fsimage中,当启动后,如果fsimage发现违反了配额限制,这输出警告。另外,设置或删除配额会创建一个空的日志。
只有管理员可以设置名称配额和空间配额,下面的命令设置/清理名称配额。N需要是一个正整数。
dfsadmin -setQuota N directory...directory
dfsadmin -clrQuota directory...directory
例如,下面对于/data目录限制3个名称配额:

hdfs dfs -mkdir /data
hdfs dfs -setQuota 3 /data
hdfs dfsadmin -setQuota 3 /data
hdfs dfs -touchz /data/f{1,2}
#创建第三个文件
hdfs dfs -touchz /data/f3
touchz: The NameSpace quota (directories and files) of directory /data is exceeded: quota=3 file count=4
#清楚名称配额
hdfs dfsadmin -clrQuota /data
登录后复制

空间配额(space quota)是目录的空间大小限制。如果超过这个配额,块写入操作会失败。副本也算配额中的一部分(GB的数据并且一共三个副本那么会消耗3GB的空间配额)。配额为0时,文件可以被创建,但是不能向文件中写入块。创建空间配额的命令如下,N可以有是5g,50GB,2t,2TB等。如果N是负数,那么则不能创建文件或写入任何数据。
dfsadmin -setSpaceQuota ...
dfsadmin -clrSpaceQuota ...

#重新创建/data
hdfs dfs -rm -r /data
hdfs dfs -mkdir /data
hdfs dfsadmin -setSpaceQuota 30m /data
#生成一个9M的文件
dd if=/dev/zero of=/tmp/f bs=1M count=200
#追加到文件
dfs dfs -appendToFile /tmp/f /data/f
#第二次追加,此时已经超过配额大小(副本为3)
dfs dfs -appendToFile /tmp/f /data/f
......
appendToFile: The DiskSpace quota of /data is exceeded: quota = 1073741824 B = 1 GB but diskspace consumed = 1207959552 B = 1.13 GB
登录后复制

另外,通过fs -count -q directory...directory命令,使用-q选项,可以显示目录的名称配额,剩余名称配额,空间配额,可用空间配额。如果目录没有设置配额,会显示为none和inf。

?参考:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html

原文地址:HDFS配额操作实战, 感谢原作者分享。

08-31 00:52