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:
l NameQuotas:
-setQuota:设置目录下文件和目录数quota
-clrQuota:取消目录下文件和目录数quota
l 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。