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。