名称配额是在对应的目录下所有文件和目录名称的数量上的限制。当超过这个配额的时候,文件或目录就会创建失败,重命名后名称配额仍然有效。
因为比较简单,所以我们直接测试:
[root@testbig1 ~]# hdfs dfs -mkdir /data/test_quota1
[root@testbig1 ~]# hdfs dfsadmin -setQuota 2 /data/test_quota1
[root@testbig1 ~]# hdfs dfs -count -q /data/test_quota1
2 1 none inf 1 0 0 /data/test_quota1
注:这里对上面的返回结果进行解释:
第1个值表示文件数限额
第2个值表示可用文件数
第3个值表示空间限额大小(字节)
第4个值表示可用空间大小(字节)
第5个值表示目录数
第6个值表示文件数
第7个值表示总大小
第8个值表示文件/目录名
[root@testbig1 ~]# hdfs dfs -put fair-scheduler.xml /data/test_quota1/
[root@testbig1 ~]# hdfs dfs -count -q /data/test_quota1
2 0 none inf 1 1 1469 /data/test_quota1
[root@testbig1~]# hdfs dfs -put griffin.keytab /data/test_quota1/
put: The NameSpace quota (directories andfiles) of directory /data/test_quota1 is exceeded: quota=2 file count=3
可能有朋友发现问题了,上面设置/data/test_quota1的名称配额为2,为啥测试后发现只能存放一个文件数呢?
这是因为HDFS在设计的时候,将目录本身也包含了,即占用一个配额数,所以设置为2时,其实只能放一个文件或目录。
[root@testbig1 ~]# hdfs dfsadmin -clrQuota /data/test_quota1
[root@testbig1 ~]# hdfs dfs -put griffin.keytab /data/test_quota1/
可以看到put成功了,再次查看配额信息:
[root@testbig1 ~]# hdfs dfs -count -q /data/test_quota1
none inf none inf 1 2 2575 /data/test_quota1
如果前面两个值为none和inf时,表示没有设置名称配额。
空间配额是目录的空间大小限制。如果超过这个配额,块写入操作会失败。副本也算配额中的一部分。空间配额为0的时候,可以创建文件,但是不能向文件中写入内容。
我们还是直接来测试,这样更好地理解。
[root@testbig1 ~]# hdfs dfs -mkdir /data/test_quota2
[root@testbig1 ~]# dd if=/dev/zero of=./file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.12234 s,857 MB/s
[root@testbig1 ~]# du -sh file
100M file
[root@testbig1 ~]# hdfs dfsadmin -setSpaceQuota 209715200 /data/test_quota2
[root@testbig1 ~]# hdfs dfs -put file /data/test_quota2/
put: The DiskSpace quota of/data/test_quota2 is exceeded: quota = 209715200 B = 200 MB but diskspaceconsumed = 402653184 B = 384 MB
这里估计朋友又好奇了,这是什么鬼,明明设置为200MB大小的配额,为啥100MB的文件都放不下。这里我再解释一下:
其实这个跟HDFS的块大小有关系。我们环境的HDFS的blocksize(dfs.block.size, dfs.blocksize)大小设置为128MB,副本因子为3。
NameNode 写文件时会分配block倍数的大小,然后检查对应目录的空间配额。
当“目录已经写入的容量+ 当前blocksize*3”与 “目录空间配额” 进行比较,如果前者大于后者,就会报错。对于我们上面的测试,即0+384MB > 200MB,大于空间配额的设置,所以会失败。
为了更直观的认识,我们将空间配额设置为385MB,再测试一下:
[root@testbig1 ~]# hdfs dfsadmin -setSpaceQuota 403701760 /data/test_quota2
[root@testbig1 ~]# hdfs dfs -put file/data/test_quota2/
可以看到已经成功了。
当然我们也可以查看空间配额的信息:
[root@testbig1 ~]# hdfs dfs -count -q /data/test_quota2/
none inf 403701760 89128960 1 1 104857600 /data/test_quota2
第3个值表示:空间限额
第4个值表示:可用空间
再次上传,又会出现错误:
[root@testbig1 ~]# hdfs dfs -put file /data/test_quota2/fsf
put: The DiskSpace quota of/data/test_quota2 is exceeded: quota = 403701760 B = 385 MB but diskspaceconsumed = 717225984 B = 684 MB
[root@testbig1 ~]# hdfs dfsadmin -clrSpaceQuota /data/test_quota2
[root@testbig1 ~]# hdfs dfs -put file /data/test_quota2/fsf
可以看到,清除空间配额后,再次成功上传上面的文件了。