一文搞懂Hadoop Archive

語言: CN / TW / HK

【概述】


在HDFS儲存體系中,可儲存的檔案數量受限於NN的記憶體大小。因為在NN記憶體中,儲存了所有檔案的block資訊。


因此,對於大量小檔案問題,可通過聯邦(Federation)和歸檔(Archive)來解決。


聯邦是通過在叢集中增加NN,不同的NN位於不同的名稱空間,從而增大了記憶體空間,使其可以儲存更多的檔案。


而歸檔則是將一部分小檔案打包到一個或多個大檔案中,減少小檔案的block數,達到儲存更多檔案的目的。


本文就來聊聊歸檔的相關知識。


【歸檔的使用】


從官方文件中可以瞭解到,歸檔檔案是一個特殊格式的檔案,並且具有".har"的副檔名


通過如下命令可以對指定目錄進行歸檔


hadoop archive -archiveName name -p <parent> [-r <replication factor>] <src>* <dest>

#
 -archiveName name: 指定歸檔檔案的名稱(帶.har副檔名)
# -p <parent>: 指定一個或多個待歸檔目錄的(共同)父目錄
# <src>: 指定一個或多個待歸檔的目錄,注意:這裡實際填寫的是相對上面父目錄的相對路徑
# <dst>: 指定歸檔檔案的存放路徑
# -r <replication factor>: 指定歸檔檔案的副本數


例如:對/hncscwc目錄下的config、tar、sbin三個目錄進行歸檔,歸檔檔案存放到/test/har目錄下,歸檔檔案的名稱為demo.har,對應命令如下所示:


hadoop archive -archiveName demo.har -p /hncscwc config tar sbin /test/har


執行完上面的命令後,就已經完成對指定目錄進行歸檔了。


由於歸檔檔案本身是對HDFS檔案系統目錄進行對映,即可以理解為是一個抽象的檔案系統。因此,對檔案檢視對相關命令仍舊可以使用,只不過檔案的URL有變化,具體為:


har:///schema-hostname:port/archivePath/archiveFile
# 通常不需要指定schema-hostname:port,因此可以簡化為
har:///archivePath/archiveFile


例如:檢視上面歸檔後的檔案


hdfs dfs -ls har:///test/har/demo.har/
Found 3 items
drwxr-xr-x - root supergroup 0 2021-11-05 15:46 har:///test/har/demo.har/config
drwxr-xr-x - root supergroup 0 2021-11-05 15:45 har:///test/har/demo.har/sbin
drwxr-xr-x - root supergroup 0 2021-11-05 15:44 har:///test/har/demo.har/tar

# 近一步檢視 tar 目錄下的內容
hdfs dfs -ls har:///test/har/demo.har/tar
Found 10 items
-rw-r--r-- 3 root supergroup  334692032 2021-11-05 11:01 har:///test/har/demo.har/tar/rancheretcd.tar
-rw-r--r-- 3 root supergroup  154733056 2021-11-05 11:01 har:///test/har/demo.har/tar/ranchergrana.tar
-rw-r--r-- 3 root supergroup 1867114496 2021-11-05 11:03 har:///test/har/demo.har/tar/rancherk8s.tar
-rw-r--r-- 3 root supergroup  343598080 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sagent.tar
-rw-r--r-- 3 root supergroup  302129664 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sauto.tar
-rw-r--r-- 3 root supergroup  122310656 2021-11-05 11:02 har:///test/har/demo.har/tar/rancherk8sdashboard.tar
-rw-r--r-- 3 root supergroup  249991168 2021-11-05 11:03 har:///test/har/demo.har/tar/rancherk8ssetchost.tar
-rw-r--r-- 3 root supergroup  490426368 2021-11-05 11:12 har:///test/har/demo.har/tar/rancherkubectld.tar
-rw-r--r-- 3 root supergroup  502795776 2021-11-05 11:12 har:///test/har/demo.har/tar/rancherlbserver.tar
-rw-r--r-- 3 root supergroup 1103052800 2021-11-05 11:14 har:///test/har/demo.har/tar/rancherserver.tar


【歸檔檔案】


在深入歸檔原理之前,首先來看下歸檔檔案具體都包括哪些檔案,這些檔案裡面又分別寫了些什麼內容。


歸檔檔案在hdfs中實際上是以一個目錄形式存在的,在該目錄下又包含了多個檔案,這些檔案可以分為兩類:一類是元資料檔案,通常又稱為索引檔案;一類是資料檔案,也就是待歸檔目錄下檔案的真實資料。


通過命令檢視上面歸檔後的檔案(demo.har)


hdfs dfs -ls /test/har/demo.har
Found 6 items
-rw-r--r-- 3 root supergroup 0 2021-11-05 15:50 /test/har/demo.har/_SUCCESS
-rw-r--r-- 3 root supergroup 3937 2021-11-05 15:50 /test/har/demo.har/_index
-rw-r--r-- 3 root supergroup 24 2021-11-05 15:50 /test/har/demo.har/_masterindex
-rw-r--r-- 3 root supergroup 1103092478 2021-11-05 15:49 /test/har/demo.har/part-0
-rw-r--r-- 3 root supergroup 2701957824 2021-11-05 15:49 /test/har/demo.har/part-1
-rw-r--r-- 3 root supergroup 1667653632 2021-11-05 15:49 /test/har/demo.har/part-2


(1)_index檔案

待歸檔檔案的索引資訊,該檔案只有1個,裡面儲存了原始檔案的相關資訊,例如檔案的路徑,儲存在哪個part資料檔案中,在part檔案中的起始偏移位置,原始檔案的大小,以及檔案的相關屬性。


索引檔案內容以文字格式儲存,具體格式如下圖所示:




這裡有幾點要說明:

1. index檔案中以為單位記錄每個目錄、檔案的資訊。即每個資訊都單獨寫一行

2. 每行中的各個部分都以空格來分隔

3. 目錄/檔案路徑以UTF-8格式寫入,因此"/"會轉義為%2F

4. 目錄的標示固定為"dir",檔案的標示固定為"file"

5. 由於目錄並未真實寫入到part資料檔案中,因此沒有寫入的part檔名,同樣,在part檔案中的起始偏移,檔案長度均固定為0

6. 目錄資訊中會記錄該目錄下的檔案列表 

7. 屬性資訊由最後修改時間許可權轉換後的整數檔案所屬的使用者檔案所屬的使用者組這幾個部分組成,中間以"+"相連。


實際例子如下所示:


%2F dir 1636098388324+493+root+supergroup 0 0 sbin tar config
%2Ftar dir 1636098266576+493+root+supergroup 0 0 rancheretcd.tar ranchergrana.tar rancherk8s.tar rancherk8sagent.tar rancherk8sauto.tarrancherk8sdashboard.tar rancherk8ssetchost.tar rancherkubectld.tar rancherlbserver.tar rancherserver.tar
%2Fsbin%2Fmapred-env.sh file part-0 1103062411 1383 1636078798378+420+root+supergroup
%2Ftar%2Francherserver.tar file part-0 0 1103052800 1636082069207+420+root+supergroup

#
... 省略 ...


(2)_masterindex

該檔案的格式就比較簡單,記錄index檔案的索引資訊。

同樣以行為單位,以文字形式寫入;在index檔案中每1000行資訊,在該檔案中記錄為一行。

檔案的首行為版本資訊,隨後的每一行均為索引資訊。

每一行索引資訊又由四部分組成,起始索引、結束索引、在index檔案中的起始偏移位置,在index檔案中的結束偏移位置


例如:上面歸檔檔案中_masterindex檔案內容為:


cat _masterindex
3
0 2108565014 0 3937


(3)part-$N

從0開始的一個或多個數據檔案,即原始待歸檔的檔案內容依次寫入了資料檔案中。


【原理】


從上面講到的歸檔檔案及其格式中可以看出,歸檔實際上是將多個小檔案寫入到一個大檔案中,並構造相應的索引檔案記錄檔案屬性,層級關係等。


歸檔命令具體是通過MR任務來完成的,其中有一個或多個map任務,具體個數根據待歸檔目錄檔案的總大小決定。每個map任務負責將一部分待歸檔的檔案寫入到資料檔案(part)中,同時將歸檔檔案寫入的資料檔名,在資料檔案中的起始偏移位置,檔案長度等資訊彙總給reduce任務。


僅有的一個reduce任務,則將上述歸檔的檔案資訊,目錄資訊寫入到_index,_masterindex檔案中。


注意:歸檔命令執行完成後,其原始檔案仍舊還在,需要手動刪除才能真正做到釋放小檔案在NN中對應儲存的block資訊。另外,由於小檔案的內容被打包寫入到了資料檔案中,因此磁碟空間並沒有因此減少,相反還增加了索引檔案(但索引檔案長度一般都比不大)。


【總結】


小結一下,本文主要講述瞭如何使用archive命令對目錄檔案進行歸檔,同時通過分析歸檔檔案的組成及其格式,以及如何產生的,來解釋歸檔是如何做到處理大量小檔案問題的。


好了,本文就介紹到這裡,原創不易,點贊,在看,分享是最好的支援, 謝謝~


本文分享自微信公眾號 - hncscwc(gh_383bc7486c1a)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。