HDFS ファイルのライフサイクルを管理する

ビッグデータBeginner
オンラインで実践に進む

はじめに

小売業者に商品ファイルが届きました。ある同僚は確認用のコピーを、別の同僚はアーカイブ版を必要としており、あなたは確認済みのファイルをダウンロードして調べる必要があります。これらの作業で誤って元ファイルを置き換えたり削除したりすると、チームは信頼できる入力を失ってしまいます。

ファイルのライフサイクルとは、受け取り、利用、アーカイブ、エクスポート、最後の削除までに行う一連の操作です。HDFS にはそれぞれの操作が用意されていますが、その効果は異なります。アップロードとダウンロードはファイルシステム間のコピーであり、HDFS 内でのコピーと移動は HDFS の中で完結します。

元データ用、アーカイブ用、一時作業用のディレクトリを分け、元ファイルを保持したままアーカイブをエクスポートし、使い捨てのコピーだけを削除します。HDFS のパスとアップロード・読み取りコマンドはすでに学びました。今回は慎重なファイル管理を加えます。環境とデータは以前の実験とは独立しており、全体を通してターミナルを使います。

元の入力を保管する

このステップでは、小売業者からの入力を、元ファイル専用のディレクトリにアップロードします。

raw ファイルとは、元の形で保持する入力です。別の scratch ディレクトリには一時的な作業用ファイルを置き、archive ディレクトリには保管するコピーを置きます。ディレクトリ名が自動でこのルールを強制するわけではありませんが、用途を分かりやすくできます。

ローカルの作業ディレクトリから始めます。

cd /home/labex/project

保存する前に入力を読みます。

cat /home/labex/project/data/products.txt

内容は次のとおりです。

notebook pen notebook
folder pen
notebook folder

-mkdir -p に3つのディレクトリパスを指定します。HDFS は各ディレクトリと、不足する親ディレクトリを作成します。

hdfs dfs -mkdir -p /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive /user/labex/file-lifecycle/scratch

ローカルの入力を raw ディレクトリにアップロードします。

hdfs dfs -put /home/labex/project/data/products.txt /user/labex/file-lifecycle/raw/products.txt

成功すると通常は何も表示されません。繰り返すと、保存先がすでに存在するというエラーになり、保存済みファイルの意図しない上書きを防ぎます。エラーを消すために削除するのではなく、保存された入力を確認してください。

hdfs dfs -cat /user/labex/file-lifecycle/raw/products.txt

テキストはローカルの元ファイルと一致するはずです。ローカルファイルシステムにも元ファイルが残ります。-put はローカルの入力を移動せず、コピーするためです。ここからはコピーを使って作業し、この元の入力をそのまま保ちます。

HDFS 内でコピーしてアーカイブする

このステップでは、確認用のコピーを作り、元の入力を移動せず、そのコピーだけをアーカイブに移します。

-cp は HDFS のコピー元を HDFS のコピー先にコピーします。-put とは異なり、以下の両方のパスは HDFS を指します。

hdfs dfs -cp /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/scratch/review.txt

確認用のコピーを調べます。

hdfs dfs -cat /user/labex/file-lifecycle/scratch/review.txt

同じ商品ラベルが表示されるはずです。名前が違っても同じデータであり、新しい売上バッチではありません。

確認用のコピーを保管できる状態になったら、-mv で移動します。このファイルシステム内での移動はパスを変更し、元のパスは残しません。実行前に、どのファイルがなくなり、どれが残るか予想してください。

hdfs dfs -mv /user/labex/file-lifecycle/scratch/review.txt /user/labex/file-lifecycle/archive/products-reviewed.txt

scratch と archive をまとめて一覧表示します。-ls には複数のパスを指定できます。

hdfs dfs -ls /user/labex/file-lifecycle/scratch /user/labex/file-lifecycle/archive

archive の項目は /archive/products-reviewed.txt で終わり、scratch に review.txt はないはずです。元ファイルに影響がなかったことも確かめます。

hdfs dfs -cat /user/labex/file-lifecycle/raw/products.txt

3行の内容は引き続き一致するはずです。完了後にこのステップに戻った場合は、コピーと移動をやり直さず、既存のアーカイブを確認してください。scratch の移動元は -mv によってすでになくなっています。また、既存のアーカイブを安易に上書きしてはいけません。

ファイルをエクスポートしてサイズを調べる

このステップでは、アーカイブしたファイルをダウンロードし、ファイル数とストレージ使用量を確認します。

-get は HDFS のコピー元をローカルのコピー先にコピーします。以下の最初のパスは HDFS、2つ目はローカルです。

hdfs dfs -get /user/labex/file-lifecycle/archive/products-reviewed.txt /home/labex/project/output/products-exported.txt

何も表示されずにプロンプトが戻るはずです。すでにダウンロード済みなら、ローカルの保存先を確認してください。既存ファイルに再度ダウンロードすると、存在するというメッセージが出る場合があります。最初の実験と同じように、ローカルの diff で内容を確かめます。

diff /home/labex/project/data/products.txt /home/labex/project/output/products-exported.txt

差分は表示されないはずです。これはエクスポートしたコピーなので、HDFS のアーカイブとローカルの元ファイルは両方とも残ります。

ディレクトリの内容を調べる -count は、ディレクトリ数、ファイル数、内容のバイト数、パスを表示します。ディレクトリ数には、指定したディレクトリ自体も含まれます。

hdfs dfs -count /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive

各行は、1つのファイルを含む1つのディレクトリを示すはずです。アーカイブと元データのバイト列は同じなので、両行の内容のサイズも同じになります。実際の行を保存します。

hdfs dfs -count /user/labex/file-lifecycle/raw /user/labex/file-lifecycle/archive > /home/labex/project/output/file-counts.txt

-du はファイルサイズをまとめて表示します。-h を付けると、必要に応じて読みやすい単位を使います。

hdfs dfs -du -h /user/labex/file-lifecycle/raw

各列は、内容のサイズ、複製を含めた使用量、パスを示します。この環境のレプリケーション係数は1なので、このファイルの2つのサイズ列は一致するはずです。ブロックと複製は後の実験で詳しく学びます。別の環境で2列目が大きくても、業務上の記録が増えているとは限りません。

続ける前に、操作の範囲を自分で説明してみてください。-cp は HDFS 内のコピー、-mv は HDFS のパスの変更、-get はローカルコピーの作成です。

使い捨てのコピーだけを削除する

このステップでは、削除に関する設定を調べ、入力とアーカイブを残しながら、確認済みの一時ファイルだけを削除します。

削除は、これまでと性質が異なる操作です。ファイルが不要になったら、そのパスを取り除けます。HDFS には Trash(ごみ箱)の保持設定を設けられますが、HDFS を使ったというだけで復元が保証されるわけではありません。まず、分単位で設定されている Trash の保持期間を読みます。

hdfs getconf -confKey fs.trash.interval

準備済みの環境では 0 で、Trash による保持は無効です。ここでの削除は即時の削除として扱ってください。別の環境で正の値なら保持期間が有効ですが、信頼できる入力を保存しておくことの代わりにはなりません。

削除の練習だけを目的とするコピーを作成します。

hdfs dfs -cp /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/scratch/disposable.txt

削除の前に、対象そのものを一覧表示します。

hdfs dfs -ls /user/labex/file-lifecycle/scratch/disposable.txt

パスの末尾が scratch/disposable.txt であり、raw/products.txt やアーカイブではないことを確かめます。-rm は指定したファイルを削除します。再帰的な削除やワイルドカードは必要ありません。

hdfs dfs -rm /user/labex/file-lifecycle/scratch/disposable.txt

指定したファイルが削除されたことが通知されます。繰り返すとファイルがないと通知されますが、削除対象を広げず、現在の状態を調べてください。scratch の一覧を表示し、一時ファイルが残っていないことを確認します。

hdfs dfs -ls /user/labex/file-lifecycle/scratch

空のディレクトリではファイル項目は表示されません。最後に、残すべき2つのファイルを確認します。

hdfs dfs -ls /user/labex/file-lifecycle/raw/products.txt /user/labex/file-lifecycle/archive/products-reviewed.txt

両方のパスが表示されるはずです。元の入力を失わずに、アップロード、コピー、アーカイブ、エクスポート、サイズ確認、そして一時作業ファイルだけの削除というライフサイクルを完了できました。

まとめ

元データをそのまま保ち、確認用コピーを作成し、そのコピーをアーカイブに移動して、ローカルファイルシステムにエクスポートしました。ファイル数とストレージのサイズを読み取り、Trash の設定を調べ、名前を指定した使い捨てファイルだけを削除しました。

次は、複数のファイルからなる毎日のバッチに、この習慣を応用します。どのファイルがバッチに含まれるかを把握することは、アップロード方法を知ることと同じくらい大切です。