天天看點

HDFS QUOTA測試

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>

使用舉例:

HDFS QUOTA測試
HDFS QUOTA測試

(2)、-clrQuota

使用說明:取消目錄下檔案和目錄數quota

使用方法:hdfs dfsadmin –clrQuota <dirname>...<dirname>

使用舉例:

HDFS QUOTA測試

(3)、-setSpaceQuota

使用說明:設定目錄下檔案大小quota

使用方法:

hdfs dfsadmin -setSpaceQuota<quota> <dirname>...<dirname>

使用舉例:

HDFS QUOTA測試

(4)、-clrSpaceQuota

使用說明:取消目錄下檔案大小quota

使用方法:hdfs dfsadmin –clrSpaceQuota <dirname>...<dirname>

使用舉例:

HDFS QUOTA測試

三、   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資訊

HDFS 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資訊

HDFS QUOTA測試

通過截圖看出,設定了目錄quota/test1的name quota為10之後,REMAINING_QUOTA資訊顯示為9,可以看出name quota計算的時候将目前目錄計算在内了。然後從本地put了9個檔案到該目錄下,REMAINING_QUOTA顯示為0 。

(5)、繼續put 1個本地的檔案到quota/test1目錄

HDFS QUOTA測試

從截圖看出,雖然我從本地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占用資訊

操作見下圖:

HDFS QUOTA測試

fsck quota/test2

HDFS QUOTA測試

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目錄下

HDFS QUOTA測試
HDFS QUOTA測試

從圖中看出,由于超過了space quota限定的空間大小,當我們在往目錄裡拷貝檔案的時候,會抛出一個異常,異常提示要拷貝的檔案超過了quota限額。通過fs –ls檢視,隻存在第一次拷貝的檔案。

(6)、修改space quota,設定目錄quota/test2 的space quota為1G

HDFS QUOTA測試

從截圖看出,到重新設定目錄的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資訊

HDFS QUOTA測試

(6)、從本地put 2個檔案到quota/test5目錄

HDFS QUOTA測試

從本地put 2個檔案到quota/test5目錄時候,由于超過了name quota,是以隻put成功1個檔案。從截圖看出,name quota已滿,space quota 還有剩餘。

(7)、拷貝另外一個555000000bytes檔案到quota/test5目錄

HDFS QUOTA測試

雖然space quota 還有剩餘,但是由于name quota已滿,是以在上傳檔案的時候會提示name quota已滿。

(8)、删除quota/test5目錄下的一個空檔案,然後拷貝一個555000000bytes檔案到quota/test5目錄

HDFS QUOTA測試

由于删除了一個空檔案,是以name quota剩餘一個名額,拷貝一個555000000bytes檔案到quota/test5目錄,是以不存在name quota滿的問題,但是由于超過了space quota限定,會提示超過space quota。

綜上,當對一個目錄同時開啟name quota和space quota的時候,hdfs在驗證的時候會先驗證name quota,在驗證space quota。

四、   總結

經過前面分析和測試,2.4版本的quota功能,總體滿足我們需

求,不存在嚴重影響使用的bug。

繼續閱讀