Hadoop アーカイブは特殊な形式のアーカイブです。Hadoop アーカイブはファイルシステムディレクトリにマップされます。Hadoop アーカイブは常に *.har 拡張子を持ちます。Hadoop アーカイブディレクトリには、メタデータ(_index と _masterindex の形式)とデータ (part-*) ファイルが含まれています。_index ファイルには、アーカイブの一部であるファイルの名前と、part ファイル内の場所が含まれています。
使用方法: hadoop archive -archiveName name -p <親ディレクトリ> [-r <レプリケーションファクター>] <ソース>* <宛先>
-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 シェルコマンドは機能しますが、URI が異なります。また、アーカイブは不変であることに注意してください。そのため、名前の変更、削除、作成はエラーを返します。Hadoop アーカイブの URI は次のとおりです。
har://スキーム-ホスト名:ポート/アーカイブパス/アーカイブ内のファイル
スキームが提供されていない場合、基になるファイルシステムが想定されます。その場合、URI は次のようになります。
har:///アーカイブパス/アーカイブ内のファイル
アーカイブ内のすべての fs シェルコマンドは透過的に機能するため、解凍はコピーするだけです。
順次解凍するには
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 引数の重要性を理解するために、上記の例をもう一度見てみましょう。hadoop アーカイブで ls (lsr ではない) を実行する場合
hdfs dfs -ls har:///user/zoo/foo.har
出力は次のようになります。
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
その後、次を使用して Hadoop アーカイブで ls を実行すると
hdfs dfs -ls har:///user/zoo/foo.har
次の結果が得られます。
har:///user/zoo/foo.har/hadoop/dir1 har:///user/zoo/foo.har/hadoop/dir2
/user/hadoop ではなく /user/ を基準にして、アーカイブされたファイルがアーカイブされていることに注意してください。
MapReduce で Hadoop アーカイブを使用するのは、デフォルトのファイルシステムとは異なる入力ファイルシステムを指定するのと同じくらい簡単です。/user/zoo/foo.har の HDFS に Hadoop アーカイブが保存されている場合、このアーカイブを MapReduce 入力として使用するには、入力ディレクトリを har:///user/zoo/foo.har として指定するだけです。Hadoop アーカイブはファイルシステムとして公開されているため、MapReduce は Hadoop アーカイブ内のすべての論理入力ファイルを 入力として使用できます。