TT Lab
はじめる
学ぶ 学習パス コース

Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する

誤って消したファイルをゴミ箱とスナップショットから復元する

TT Labで続きを見る

目標

注文フォルダーにスナップショットを許可して取ったあと、シェルのrmで削除したファイルはごみ箱から、-skipTrashで削除したファイルはスナップショットから復元します。ファイルを変更したあと、2つのスナップショットの差分を見て、スナップショットがあるディレクトリが丸ごとは削除できないことと、スナップショット名を変更することまで試します。

なぜ重要なのか

削除したファイルを復元する方法は2つで、性格が違います。ごみ箱はクライアント(シェル)が行うことです。hdfs dfs -rmが、ファイルを削除する代わりに、ユーザーのホームの.Trash/Currentに移動します。そのため、-skipTrashを指定したり、シェルではないプログラム(SparkやAPI)が削除したりすると、ごみ箱を経由しません。 スナップショットはNameNodeが行うことです。スナップショットを取る瞬間のディレクトリツリーをメタデータとして記憶し、そのあと何が削除されたり変更されたりしても、スナップショット側のブロックは削除しません。データをコピーしないので、取るのはすぐに終わり、その代わり、スナップショットが保持しているブロックの分だけ、容量が返却されません。 本番では、両方を併用します。ごみ箱は人間のミスを、スナップショットはジョブのミス(間違ったoverwrite、削除したパーティション)を元に戻します。差分レポート(snapshotDiff)は「昨日から何が変わったか」に答え、distcpの増分コピーもこれを使います。

ステップ

  1. /snap/ordersに、a.csv(=/data/finance/q1.csv)・b.csv(=q2.csv)・c.csv(=/data/small/sensor-0000.csv)をアップロードして、スナップショットを許可してください(hdfs dfsadmin -allowSnapshot)。
  2. スナップショットs1を取ってください(hdfs dfs -createSnapshot /snap/orders s1)。
  3. hdfs dfs -rm /snap/orders/a.csvで、a.csvを削除してください(ごみ箱に行きます)。
  4. hdfs dfs -rm -skipTrash /snap/orders/b.csvで、b.csvを削除したあと、/snap/orders/.snapshot/s1/b.csvからコピーして復元してください。
  5. c.csvの末尾に行を1つ追記し(-appendToFile)、スナップショットs2を取ったあと、hdfs snapshotDiff /snap/orders s1 s2の出力を、/root/hdp/snap/diff.txtに保存してください。
  6. hdfs dfs -rm -r -skipTrash /snap/ordersを実行してみて、エラー出力を、/root/hdp/snap/deny.txtに保存してください。
  7. スナップショットs2の名前をbefore-auditに変更してください(hdfs dfs -renameSnapshot)。
  8. /root/hdp/snap/report.mdに、## 휴지통・## 스냅샷・## 지킬 것の3つの節を書いてください(見出しは韓国語で、順に「ごみ箱」「スナップショット」「守ること」を意味します)。2つ目の節に、ステップ5の差分レポートの行数(ヘッダー行を除く)を入れてください。

参考

スナップショットを許可する

/snap/ordersをHDFSに作成し、/data/finance/q1.csvをa.csv、/data/finance/q2.csvをb.csv、/data/small/sensor-0000.csvをc.csvとしてアップロードして、hdfs dfsadmin -allowSnapshot /snap/ordersを実行してください。

スナップショットは、どのディレクトリでも取れるわけではありません。管理者が「このディレクトリはスナップショットを取ってもよい」と許可したディレクトリ(snapshottable)でだけ可能です。WebHDFSのGETFILESTATUSにsnapshotEnabledが現れるかを見てください。

スナップショットs1を取る

hdfs dfs -createSnapshot /snap/orders s1で、スナップショットs1を取ってください。

取るのはすぐに終わります。ブロックをコピーせず、その瞬間のツリーをNameNodeが記憶するだけです。hdfs dfs -ls /snap/orders/.snapshot/s1で見てください。

rmはごみ箱に移動する

hdfs dfs -rm /snap/orders/a.csvで、a.csvを削除してください。ファイルは、/user/root/.Trash/Current/snap/orders/a.csvに移動している必要があります。

シェルのrmは、削除する代わりに移動します。出力の「Moved: … to trash at …」が、その意味です(ログレベルをWARNにしていると見えません)。復元するには、そのパスからmvで元に戻せばよいです。

-skipTrashで削除したものはスナップショットから

hdfs dfs -rm -skipTrash /snap/orders/b.csvでb.csvを削除したあと、hdfs dfs -cp /snap/orders/.snapshot/s1/b.csv /snap/orders/b.csvで復元してください。

-skipTrashはごみ箱をスキップするので、ごみ箱にはありません。しかし、s1がそのファイルのブロックを保持しているので、スナップショットのパスで読めます。スナップショットは読み取り専用なので、mvではなくcpです。

2つのスナップショットの差分

echo 2026-03-01,s-9999,99.9 | hdfs dfs -appendToFile - /snap/orders/c.csvのように、c.csvに行を1つ追記して、スナップショットs2を取ったあと、hdfs snapshotDiff /snap/orders s1 s2の出力を、/root/hdp/snap/diff.txtに保存してください。

差分レポートの記号は、M(変更)、+(作成)、-(削除)、R(名前変更)です。b.csvが「-」と「+」で2回出る理由を考えてみてください。復元したものは、同じ名前の新しいファイルです。採点ツールは、WebHDFSのGETSNAPSHOTDIFFと自分のファイルを、行単位で比べます。

スナップショットがディレクトリを守る

hdfs dfs -rm -r -skipTrash /snap/ordersを実行してみて、エラー出力を、/root/hdp/snap/deny.txtに保存してください。/snap/ordersはそのまま残っている必要があります。

スナップショットが1つでもあるsnapshottableディレクトリは、削除できません。ディレクトリの削除は、NameNodeに送るリクエスト1つなので、丸ごと拒否され、中のファイルもそのまま残ります。削除するには、スナップショットをすべて削除し(-deleteSnapshot)、許可を取り下げてからです。

スナップショットの名前を変更する

hdfs dfs -renameSnapshot /snap/orders s2 before-auditで、スナップショットs2の名前をbefore-auditに変更してください。

スナップショットの名前は、日付や出来事で付けておくと、あとで探しやすくなります。名前を変えても、内容と差分レポートはそのままです。

復元する2つの方法を書き残す

/root/hdp/snap/report.mdに、## 휴지통・## 스냅샷・## 지킬 것の3つの節を書いてください(見出しは韓国語で、順に「ごみ箱」「スナップショット」「守ること」を意味します)。2つ目の節に、ステップ5の差分レポートの行数(最初のヘッダー行を除いた記号の行の数)を入れてください。

ごみ箱が誰の機能で、いつ役に立たないか、スナップショットが何を記憶して何を保持するか、このフォルダーを守るために何をルールにするかを書いてください。