[置顶] HDFS QUOTA测试

HDFS QUOTA测试

HDFS的quota功能其实在咱们大集群版本0.20.203就已经有了。但是在那个版本中存在几个致命的bug,所以大集群没用上线quota,但是这些bug在最新版本中已经得到解决。

最新关于quota的bug的相关信息见:

https://issues.apache.org/jira/browse/HDFS-1026?jql=project%20%3D%20HDFS%20AND%20issuetype%20%3D%20Bug%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened%2C%20%22Patch%20Available%22)%20AND%20text%20~%20%22quota%22

目前依然存在的并对2.4版本有影响的bug:

(1)、https://issues.apache.org/jira/browse/HDFS-4897 :拷贝设置过quota的目录,拷贝之后的目录quota信息会丢失。

(2)、https://issues.apache.org/jira/browse/HDFS-6192 :通过webhdfs和HttpFs api去设置quota时,quota不生效

以上两个bug,其中第一个需要测试确认,第二个bug,由于我们不会使用webhdfs和httpfs api去设置quota,所以不用考虑。

一、   说明及使用场景

在多人共用集群的情况下,设置quota非常重要,特别是在处理大量数据时,一不小心就把所有的空间用完造成别人无法存取。咱们现在的大集群就是由于没有设置quota,各个业务线不会因为空间不足而积极删除历史数据,导致整个集群存储了大量过时无效的数据,严重浪费存储空间。
    hdfs的quota设定是针对目录而不是账号,所以在管理上最好让每一个账号只能写入某一个目录(/user/${user_name}),然后对各个目录加上quota进行限定。

Quota设定方式有两种:

l  Name Quotas:类似ulimit里的hard limit,也就是设定某个目录下文件和目录的总数

l  Space Quotas:设定某个目录下使用的空间大小

这两种方式可以独立使用也可以同时使用,既可以对一个目录同时设置name quotas和space quotas,也可以设置一种quota。

二、   API使用方法

quota功能的开启由DFSAdmin提供的接口来实现的,包括设置quota和取消quota:

NameQuotas

-setQuota:设置目录下文件和目录数quota

-clrQuota:取消目录下文件和目录数quota

SpaceQuotas

-setSpaceQuota:设置目录存储空间大小quota

-clrSpaceQuota:取消目录下存储空间大小quota

当设置了quota后,要查看quota是否生效,可以通过以下命令来查看:

hadoop fs –count -q <dirname>

QUOTA       REMAINING_QUOTA  SPACE_QUOTA  REMAINING_SPACE_QUOTA  DIR_COUNT   FILE_COUNT CONTENT_SIZE FILE_NAME

以上各项含义如下:

QUOTA :命名空间的quota(限制文件数)   

REMAINING_QUOTA:剩余的命名空间quota(剩余能创建的文件数目)

SPACE_QUOTA :物理空间的quota(限制磁盘空间占用大小)

REMAINING_SPACE_QUOTA:剩余的物理空间

DIR_COUNT :目录数目

FILE_COUNT :文件数目

CONTENT_SIZE:目录逻辑空间大小

FILE_NAME :路径

说明:当没有设置quota时,前面四项会显示成none和inf。

设置quota只能由管理员来操作,普通用户是没有权限的,以下操作是在虚拟机2.4测试环境中进行,操作用户为管理员hadoop。

(1)-setQuota

使用说明:设置目录下文件和目录数quota

使用方法:hdfs dfsadmin -setQuota <quota><dirname>...<dirname>

使用举例:

 

(2)、-clrQuota

使用说明:取消目录下文件和目录数quota

使用方法:hdfs dfsadmin –clrQuota <dirname>...<dirname>

使用举例:


(3)、-setSpaceQuota

使用说明:设置目录下文件大小quota

使用方法:

hdfs dfsadmin -setSpaceQuota<quota> <dirname>...<dirname>

使用举例:


(4)、-clrSpaceQuota

使用说明:取消目录下文件大小quota

使用方法:hdfs dfsadmin –clrSpaceQuota <dirname>...<dirname>

使用举例:


三、   quota测试

quota测试目的是测试是否有影响启用quota功能的问题存在。1、根据hadoop jira提供的信息,影响2.4版本的bug主要有前面提到的两个bug,以下针对第一个bug(HDFS-4897)进行测试:

 (1)、新建目录/user/hadoop/quota/test3

 (2)、设置新建目录的quota信息

(3)、拷贝目录test3到test4

(4)、查看目录test3和test4的quota信息


从截图上可以看出,test4目录没有继承test3目录的quota信息,即使使用-cp –p的方式也一样,但拷贝之后,test3目录的quota信息依然有效,既没有对原始目录设置的quota信息产生影响。经过分析,其实这个bug不算bug,对于拷贝之后的目录,如果有需要,可以重新设置quota信息,不一定非要继承原始目录设置的quota信息。

2、name quota测试

(1)、在本地生成10个文件

(2)、设置目录quota/test1的name quota为10

(3)、从本地put 9个文件到quota/test1目录

(4)、观察quota/test1目录的name quota信息


通过截图看出,设置了目录quota/test1的name quota为10之后,REMAINING_QUOTA信息显示为9,可以看出name quota计算的时候将当前目录计算在内了。然后从本地put了9个文件到该目录下,REMAINING_QUOTA显示为0 。

(5)、继续put 1个本地的文件到quota/test1目录


从截图看出,虽然我从本地put第10个文件到quota/test1目录下,但是由于quota/test1目录也要站一个name quota名额,所以导致我在put第10个文件的时候会提醒超出quota限额了。

3、space quota测试

(1)、用teragen生成两个大小为555000000bytes的文件

(2)、设置目录quota/test2 的space quota为2G

(3)、拷贝其中一个555000000bytes文件到quota/test2目录下

(4)、查看quota占用信息

操作见下图:


fsck quota/test2


hdfs fsck出来目录的大小是555000000bytes,但是查quota,发现CONTENT_SIZE是555000000bytes,但是SPACE_QUOTA

-REMAINING_SPACE_QUOTA是1665000000bytes。这里就是涉及到两个概念,物理空间和逻辑空间:

物理空间:文件实际占用HDFS的大小(包含replication)

逻辑空间:文件本身的大小,是逻辑上占用HDFS的大小。

物理空间 = 逻辑空间 * Replication数量

hdfs fsck出来和hadoop fs -count 出来的CONTENT_SIZE指的都是逻辑空间,而物理空间是逻辑空间*备份数 ,如果replication是3,则REMAINING_SPACE_QUOTA的计算公式为:

REMAINING_SPACE_QUOTA=SPACE_QUOTA - CONTENT_SIZE * 3

综上可以看出space quota限定的是物理空间,必须考虑replication。既如果我们限定某一个目录的space quota为3G,而且replication为3,则这个目录下最多能存放原始文件大小为1G的文件。

(5)、拷贝其另外一个555000000bytes的文件到quota/test2目录下



从图中看出,由于超过了space quota限定的空间大小,当我们在往目录里拷贝文件的时候,会抛出一个异常,异常提示要拷贝的文件超过了quota限额。通过fs –ls查看,只存在第一次拷贝的文件。

(6)、修改space quota,设置目录quota/test2 的space quota为1G


从截图看出,到重新设置目录的space quota为小于该目录下的总文件大小时,不会抛出异常也不给出警告,但是查看quota信息时,REMAINING_SPACE_QUOTA会显示为负数,当然也不能再往该目录拷贝文件。

4、name quota + spacequota测试

前面2和3都是单独针对name quota和space quota的测试,由于这两种quota是可以同时作用到一个目录的,所以有必要测试一下这两种quota同时使用的情况。

(1)、新建目录quota/test5

(2)、设置name quota 为10和space quota 为2G

(3)、从本地put 7个空文件到quota/test5目录

(4)、拷贝一个555000000bytes文件到quota/test5目录

(5)、观察quota/test5目录的quota信息


(6)、从本地put 2个文件到quota/test5目录


从本地put 2个文件到quota/test5目录时候,由于超过了name quota,所以只put成功1个文件。从截图看出,name quota已满,space quota 还有剩余。

(7)、拷贝另外一个555000000bytes文件到quota/test5目录


虽然space quota 还有剩余,但是由于name quota已满,所以在上传文件的时候会提示name quota已满。

(8)、删除quota/test5目录下的一个空文件,然后拷贝一个555000000bytes文件到quota/test5目录


由于删除了一个空文件,所以name quota剩余一个名额,拷贝一个555000000bytes文件到quota/test5目录,所以不存在name quota满的问题,但是由于超过了space quota限定,会提示超过space quota。

综上,当对一个目录同时开启name quota和space quota的时候,hdfs在验证的时候会先验证name quota,在验证space quota。

四、   总结

经过前面分析和测试,2.4版本的quota功能,总体满足我们需

求,不存在严重影响使用的bug。

你可能感兴趣的:(hadoop,hdfs,quota)