Hadoop 檔案指南

概觀

Hadoop 檔案是特殊格式的檔案。Hadoop 檔案會對應到檔案系統目錄。Hadoop 檔案總是具有 *.har 副檔名。Hadoop 檔案目錄包含元資料(以 _index 和 _masterindex 形式)和資料(part-*) 檔案。_index 檔案包含屬於檔案的一部分的檔案名稱,以及在部分檔案中的位置。

如何建立檔案

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

-archiveName 是您想要建立的檔案名稱。範例為 foo.har。名稱應具有 *.har 副檔名。parent 引數是用來指定檔案應封存到的相對路徑。範例為

-p /foo/bar a/b/c e/f/g

在此,/foo/bar 是父路徑,而 a/b/c、e/f/g 是相對於父項目的相對路徑。請注意,這是一個建立檔案的 Map/Reduce 工作。您需要一個 Map/Reduce 集群才能執行此工作。有關詳細範例,請參閱後面的章節。

-r 指示所需的複製因子;如果未指定此選用引數,將使用複製因子 3。

如果你只想封存單一目錄 /foo/bar,你可以使用

hadoop archive -archiveName zoo.har -p /foo/bar -r 3 /outputdir

如果你指定的來源檔案位於加密區,它們會被解密並寫入封存檔。如果 har 檔案沒有位於加密區,它們會以明文(已解密)形式儲存。如果 har 檔案位於加密區,它們會以加密形式儲存。

如何查詢封存檔中的檔案

封存檔會將自己顯示為檔案系統層。因此,封存檔中的所有 fs shell 命令都可以使用,但 URI 不同。另外,請注意封存檔是不可變的。因此,重新命名、刪除和建立會傳回錯誤。Hadoop 封存檔的 URI 為

har://scheme-hostname:port/archivepath/fileinarchive

如果沒有提供 scheme,它會假設底層檔案系統。在這種情況下,URI 會看起來像

har:///archivepath/fileinarchive

如何解封封存檔

由於封存檔中的所有 fs shell 命令都能透明地運作,解封只是複製的問題。

要依序解封

hdfs dfs -cp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir

要並行解封,請使用 DistCp

hadoop distcp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir

封存檔範例

建立封存檔

hadoop archive -archiveName foo.har -p /user/hadoop -r 3 dir1 dir2 /user/zoo

上述範例使用 /user/hadoop 作為相對封存檔目錄來建立封存檔。目錄 /user/hadoop/dir1 和 /user/hadoop/dir2 會封存在下列檔案系統目錄中 – /user/zoo/foo.har。封存不會刪除輸入檔案。如果你想在建立封存檔後刪除輸入檔案(以減少名稱空間),你必須自行執行。在此範例中,因為指定了 -r 3,所以會使用複製因子 3。

查詢檔案

在 Hadoop 封存檔中查詢檔案就像在檔案系統中執行 ls 一樣簡單。在你封存目錄 /user/hadoop/dir1 和 /user/hadoop/dir2 之後,如上述範例所示,你可以執行以下指令,查看封存檔中的所有檔案

hdfs dfs -ls -R har:///user/zoo/foo.har/

為了解 -p 參數的重要性,讓我們再次檢視上述範例。如果您僅使用

hdfs dfs -ls har:///user/zoo/foo.har

對 hadoop 檔案庫執行 ls(而非 lsr),

har:///user/zoo/foo.har/dir1
har:///user/zoo/foo.har/dir2

輸出應為

您可能記得,檔案庫是使用下列指令建立的

hadoop archive -archiveName foo.har -p /user/hadoop dir1 dir2 /user/zoo

如果我們將指令變更為

hadoop archive -archiveName foo.har -p /user/ hadoop/dir1 hadoop/dir2 /user/zoo

hdfs dfs -ls har:///user/zoo/foo.har

然後使用

har:///user/zoo/foo.har/hadoop/dir1
har:///user/zoo/foo.har/hadoop/dir2

對 hadoop 檔案庫執行 ls,

您將會得到

請注意,已封存的檔案是相對於 /user/ 封存的,而非 /user/hadoop。