アーカイブコマンドの概要
Hadoop Archive(HAR)は、HDFS上での多数の小規模ファイルによって引き起こされるNameNodeのメタデータ負荷を軽減するための仕組みです。複数の小ファイルを1つの.harファイルにパッケージ化することで、名前空間のエントリ数を削減しつつ、実際のデータアクセスには影響を与えません。クライアント側からは通常のHDFSパスと同様に扱うことができ、操作が透過的である点が特徴です。
アーカイブ作成コマンドの基本構文は以下の通りです:
hadoop archive -archiveName <名前>.har -p <親ディレクトリパス> [-r <レプリケーション数>] <ソースパス...> <出力先ディレクトリ>
- -archiveName: 生成されるアーカイブファイルの名前を指定します(必須)。拡張子は
.harである必要があります。 - -p: アーカイブ対象の相対パス基準となる親ディレクトリを指定します(必須)。
- -r: レプリケーション数を設定します(省略時はデフォルト値が適用)。
- <src>: アーカイブする元のファイルまたはディレクトリを1つ以上指定します。
- <dest>: .harファイルの保存先となるHDFS上のディレクトリを指定します。
アーカイブファイルの作成
例として、/user/data/test 配下にある複数の小ファイルをアーカイブ化してみます。
# 対象ディレクトリの内容確認
hdfs dfs -ls /user/data/test
# input/ と upload/ を含めてアーカイブ化し、/archive以下に出力
hadoop archive \
-archiveName merged_data.har \
-p /user/data/test \
input upload \
/archive
この処理は内部的にMapReduceジョブとして実行されるため、YARNやMapReduceフレームワークが利用可能なクラスタ環境が必要です。処理が完了すると、/archive/merged_data.har というディレクトリが生成されます。
生成された.harファイルの中身は次のようになります:
_index: 各内部ファイルの位置情報やオフセットを保持するメタデータファイル_masterindex: インデックスファイルのパーティション情報を管理part-00000などのデータセグメント: 実際のファイルコンテンツが連結されて格納
アーカイブ内容の参照方法
アーカイブされたファイル群は、特別なURIスキームhar://を使用してアクセスします。通常のHDFSコマンドにこのURIを組み合わせることで、内部の構造をリスト表示できます。
# HAR内の全ファイルを再帰的に表示
hdfs dfs -ls -R har:///archive/merged_data.har
# 特定のサブディレクトリのみ確認
hdfs dfs -ls har:///archive/merged_data.har/input
注意点として、一度作成されたHARファイルは不変(immutable)であり、中のファイルを直接追加・削除・更新することはできません。変更が必要な場合は、新たにアーカイブを作り直す必要があります。
アーカイブの解凍(展開)
HARファイルから元のファイル構造を復元するには、単純なコピー操作を行います。これにより、内部データが指定されたHDFSパスに展開されます。
# 展開先ディレクトリを作成
hdfs dfs -mkdir -p /restored/data
# cpコマンドで一部を抽出
hdfs dfs -cp har:///archive/merged_data.har/input/* /restored/data/
# 大量データの場合はdistcpで並列転送
hadoop distcp har:///archive/merged_data.har/upload /restored/data/
アーカイブ自体の削除は、ディレクトリとして扱われるため通常の削除コマンドに-rフラグを付けて行います。
hdfs dfs -rm -r /archive/merged_data.har
HARの主な特性と制限事項
- 非圧縮性: HARファイル自体は圧縮機能を持たないため、ストレージ効率向上には別途圧縮戦略が必要です。
- 元ファイルの保持: アーカイブ化後も元のソースファイルは自動では削除されません。必要に応じて手動で削除してください。
- 不変性: 一度生成されたアーカイブは編集不可。ファイルの追加や削除には再アーカイブが必要です。
- 容量要件: 元データと同等以上の空き容量がHDFS上に必要です。重複してデータが存在することになるため、ストレージ使用量は一時的に増加します。