概述:
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