HDFS配额设置和测试

名称配额(Name Quota)

名称配额是在对应的目录下所有文件和目录名称的数量上的限制。当超过这个配额的时候,文件或目录就会创建失败,重命名后名称配额仍然有效。

因为比较简单,所以我们直接测试:

步骤一:创建一个测试目录

[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个值表示文件/目录名     

 

步骤四:put文件进行名称配额测试

[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

 

步骤六:再次put一个文件

[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时,表示没有设置名称配额。

 

空间配额(Space Quota)

空间配额是目录的空间大小限制。如果超过这个配额,块写入操作会失败。副本也算配额中的一部分。空间配额为0的时候,可以创建文件,但是不能向文件中写入内容。

 

我们还是直接来测试,这样更好地理解。

步骤一:创建测试目录

[root@testbig1 ~]# hdfs dfs -mkdir /data/test_quota2

 

步骤二:生成测试100MB大小的文件

[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

 

步骤三:设置空间配额大小为200MB

[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

可以看到,清除空间配额后,再次成功上传上面的文件了。

 

 

你可能感兴趣的:(Hadoop)