hadoop dfsadmin -setSpaceQuota 设置目录配额的问题

通过该命令可以来限定某个hdfs目录的大小:

 

hadoop dfsadmin -setSpaceQuota 3000 /group/d_sdo_data/user/liuxiaowen

 

但设定之后,put一个2000多字节的文件时候报错:

 

Java代码  收藏代码

  1. 12/05/14 15:41:24 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /group/d_sdo_data/user/liuxiaowen is exceeded: quota=3000 diskspace consumed=384.0m  
  2.         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  3.         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
  4.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
  5.         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
  6.         at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:95)  
  7.         at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:57)  
  8.         at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:3190)  
  9.         at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:3055)  
  10.         at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$1900(DFSClient.java:2305)  
  11.         at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2500)  
  12. Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /group/d_sdo_data/user/liuxiaowen is exceeded: quota=3000 diskspace consumed=384.0m  
  13.         at org.apache.hadoop.hdfs.server.namenode.INodeDirectoryWithQuota.verifyQuota(INodeDirectoryWithQuota.java:149)  
  14.         at org.apache.hadoop.hdfs.server.namenode.FSDirectory.verifyQuota(FSDirectory.java:1041)  
  15.         at org.apache.hadoop.hdfs.server.namenode.FSDirectory.updateCount(FSDirectory.java:859)  
  16.         at org.apache.hadoop.hdfs.server.namenode.FSDirectory.addBlock(FSDirectory.java:277)  
  17.         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.allocateBlock(FSNamesystem.java:1698)  
  18.         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1543)  
  19.         at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:665)  
  20.         at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)  
  21.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  22.         at java.lang.reflect.Method.invoke(Method.java:597)  
  23.         at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:557)  
  24.         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1434)  
  25.         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1430)  
  26.         at java.security.AccessController.doPrivileged(Native Method)  
  27.         at javax.security.auth.Subject.doAs(Subject.java:396)  
  28.         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1157)  
  29.         at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1428)  
  30.   
  31.         at org.apache.hadoop.ipc.Client.call(Client.java:1104)  
  32.         at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:226)  
  33.         at $Proxy5.addBlock(Unknown Source)  
  34.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  35.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  36.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  37.         at java.lang.reflect.Method.invoke(Method.java:597)  
  38.         at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)  
  39.         at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)  
  40.         at $Proxy5.addBlock(Unknown Source)  
  41.         at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:3185)  
  42.         ... 3 more  

 

后来发现原因:

 

 这里统计空间的时候会将备份数也考虑在里面,因为集群设置了备份数为3,所以hadoop dfsadmin -setSpaceQuota也要讲备份数考虑进去,即 hadoop dfsadmin -setSpaceQuota 9000 /group/d_sdo_data/user/liuxiaowen

 

另外,这个动作会覆盖上一次的设置;

清除命令: hadoop dfsadmin -clrSpaceQuota /group/d_sdo_data/user/liuxiaowen

查看目录限额: hadoop fs -count -q /group/d_sdo_data/user/liuxiaowen

none             inf            9000            8088            6            1                304 hdfs://nn.dc.sh-wgq.sdo.com/group/d_sdo_data/user/liuxiaowen

 

依次表示为:文件数限额  可用文件数  空间限额 可用空间 目录数  文件数  总大小 文件/目录名

 

=========================================================================================================

 

在多人共用HDFS的环境下,配置设置非常重要。特别是在Hadoop处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。Hdfs的配额设定是针对目标而不是针对账号,所有在管理上最好让每个账号仅操作某一个目录,然后对目录设置配置。

        设定方法有两种:

    • Name Quotas:设置某一个目录下文件总数
    • Space Quotas:设置某一个目录下可使用空间大小

        默认情况下Hdfs没有任何配置限制,可以使用  hadoop fs -count 来查看配置情况

               hadoop fs -count -q /user/seamon

        以下是结果,none和inf表示没有设置配额

QUOTA   REMAINING_QUOTA   SPACE_QUOTA    REMAINING_SPACE_QUOTA     DIR_COUNT FILE_COUNT   CONTENT_SIZE FILE_NAME
none       inf                                none                     inf                                             6                                        15

 

1. Name Quotas

       计算公式:QUOTA – (DIR_COUNT + FILE_COUNT) = REMAINING_QUOTA

       这里的 10000 是指 DIR_COUNT + FILE_COUNT = 10000,最大值為 Long.Max_Value       

       启用设定:hadoop dfsadmin -setQuota 10000 /user/seamon

       清除設定: hadoop dfsadmin -clrQuota /user/seamon

2. Space Quotas

       计算公式:SPACE_QUOTA – CONTENT_SIZE = REMAINING_SPACE_QUOTA

       可以使用 m, g, t 代表 MB, GB, TB

       启用设定: hadoop dfsadmin -setSpaceQuota 1g /user/seamon/

       清除設定: hadoop dfsadmin -clrSpaceQuota /user/seamon

       这里需要特别注意的是“Space Quota”的设置所看的不是Hdfs的文件大小,而是写入Hdfs所有block块的大小,假设一个文件被切分为2个blocks,在core-site.xml里面设置 dfs.block.size=64MB,dfs.replication=3,那么该文件所需要的存储空间为:2 * 64M * 3 =  384MB

       如果一个小文件(例如,1k大小的文件)被上传到hdfs,该文件并不能占满一整个blok,但是按照hdfs配置规则也需要按照一个blok计算,即存储空间为:1 x 64MB x 3 = 192MB

3. 其它事项

       hdfs的配额管理是跟着目录走,如果目录被重命名,配额依然有效。

       麻烦的是,在设置完配额以后,如果超过限制,虽然文件不会写入到hdfs,但是文件名依然会存在,只是文件size为0。当加大配额设置后,还需要将之前的空文件删除才能进一步写入。

       如果新设置的quota值,小于该目录现有的Name Quotas 及 Space Quotas,系统并不会给出错误提示,但是该目录的配置会变成最新设置的quota

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值