代码改变世界

HDFS配额管理(实战)

2018-03-15 15:20  staryea-bigdata  阅读(3504)  评论(0编辑  收藏  举报

 

 概述:

Hadoop分布式文件系统(HDFS)允许管理员为使用的名称和单独目录使用的空间数量设置配额。名称配额和空间配额是独立运作的,但这两类配额的管理和实施是密切相关的。

Name Quotas:

名称配额对根目录下的树的文件和目录的数量进行严格的限制。

如果超出配额,文件和目录创建失败。配额不变

对于重命名的目录;如果操作将导致配额冲突,则重命名操作失败。

即使目录违反了新的配额,设置配额的操作仍然会成功。新创建的目录没有相关的配额。最大的配额是Long.Max_Value。一个命令的配额会使目录保持空。(是的,一个目录对它自己的配额有影响!)
配额限制制与fsimage永久生效的。当开始时,如果fsimage违反了配额,就会对此类违规行为进行警告。(对于一开始设置配额的时候目录下文件个数已经超过了设置的个数,则对此类操作进行告警,操作动作不会失败)

设置或删除一个配额都会创建日志目录

操作:

       设置目录的配额空间,让目录下存储的文件不超过N 个

  • hdfs dfsadmin -setQuota <N> <directory>...<directory>
  • Set the name quota to be N for each directory. Best effort for each directory, with faults reported if N is not a positive long integer, the directory does not exist or it is a file, or the directory would immediately exceed the new quota.

  • 设置每个目录的名称配额为N个。对于受影响每个目录。如果N不是一个正整数,如果目录不存在,或者是一个文件,或者目录将立即超过新的配额。

       清除目录的配额空间

  • hdfs dfsadmin -clrQuota <directory>...<directory>

    Remove any name quota for each directory. Best effort for each directory, with faults reported if the directory does not exist or it is a file. It is not a fault if the directory has no quota.

Space Quotas

空间配额对于根目录下的树中的文件所使用的字节数是一个严格的限制。

如果配额不允许写入一个完整的块,块分配就会失败。一个块的每个副本都与配额相对应。

对于重命名的目录,配额不变

如果重命名操与设置的配额冲突,则重命名操作失败。

新创建的目录没有相关的配额。

配额的最大值是Long.Max_Value。

配额为零的情况下仍然允许创建文件,但不能往文件中写东西。

创建目录不使用主机文件系统空间,也不要计算空间配额。

用于保存文件元数据的主机文件系统空间不被计算在配额内。

对文件的预期复制因子收取配额;更改一个文件的复制份数将会导致信用卡或借方配额。(配额考虑到了复制,当1个文件是1G,复制是3份,设置配额是2G 则上传报错)

配额现在制与fsimage是持久的。当开始时,如果fsimage立即违反了配额,就会对此类违规行为进行警告。设置或删除一个配额会创建一个日志条目。(对于一开始设置配额的时候目录下配额空间已经超过了设置的空间,则对此类操作进行告警,操作动作不会失败)

操作:

      设置目录的存储空间配额

  • hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>

    Set the space quota to be N bytes for each directory. This is a hard limit on total size of all the files under the directory tree. The space quota takes replication also into account, i.e. one GB of data with replication of 3 consumes 3GB of quota. N can also be specified with a binary prefix for convenience, for e.g. 50g for 50 gigabytes and 2t for 2 terabytes etc. Best effort for each directory, with faults reported if N is neither zero nor a positive integer, the directory does not exist or it is a file, or the directory would immediately exceed the new quota.

  • 设置每个目录的空间配额为N个字节。这是对目录树下所有文件的总大小的严格限制。空间配额也考虑到复制,即1 GB的数据复制3消耗3GB的配额。N也可以用一个二进制前缀指定为方便起见,如50 g为50 g,2 t 2 tb等。尽最大努力为每个目录,与缺陷报告如果N是零和一个正整数,目录不存在或它是一个文件,或者目录会立即超过新配额。
  • 清除目录的存储空间配额命令
  • hdfs dfsadmin -clrSpaceQuota <directory>...<director>

    Remove any space quota for each directory. Best effort for each directory, with faults reported if the directory does not exist or it is a file. It is not a fault if the directory has no quota.

  • 移除每个目录的空间配额。对于每个有效的目录,如果目录不存在或它是一个文件,就会报告设置错误。对应目录来说没有配额不会报错。

 

测试一,配额文件和目录限制:

设置目录的文件+目录总数不超过3,(这里不包含3 应该是总数是2)

-查看当前情况

hz目录下有1个文件 2.txt

执行  hdfs dfsadmin -setQuota 3 /user/hz

创建目录a --成功

创建目录b--失败(报超出配额限制,可见参数是小于不包含)

 查询目录下文件数 是2个

尝试上传一个文件(继续报错,配额超出)

 对于已经有2个文件,修改配额为1 则不报错

清除配额,上传文件成功

 

 测试二,配额空间限制:

 查看当前的空间大小

说明当前空间配额最小为 17*3=51字节

当设置配额小于 目前已经有的大小时,则会从其他地方借用,显示为-

设置配额为50,命令执行成功

在此情况下 无法在继续传文件

创建一个32字节的文件 测试是否副本占用配额信息

 

上传文件,32+17=49

 

 测试结果报错,超出了配额限制

重新设置配额为60

查询当前配额剩余  =9 

计算为 60-17*3副本=9

 

总结:对于空间限制,配额空间是计算副本数的

 

 测试 创建目录是否占用配额空间

 

配额空间不变化

 

参考:

http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html#Space_Quotas