TT Lab
开始
学习 学习路径 课程

Apache Hadoop — 在一个 Pod 里搭起并运维 HDFS 与 YARN

从回收站和快照中恢复误删的文件

在 TT Lab 中继续学习

目标

对订单文件夹允许快照并创建快照,然后把用 shell 的 rm 删除的文件从回收站找回,把用 -skipTrash 删除的文件从快照中恢复。修改文件后查看两个快照之间的差异,还要体验有快照的目录无法被整体删除,以及重命名快照。

为什么重要

找回被删除文件有两条路,性质各不相同。回收站是客户端(shell)做的事——hdfs dfs -rm 不直接删除文件,而是把它移到用户主目录的 .Trash/Current。所以加上 -skipTrash,或者由 shell 之外的程序(Spark、API)来删除,都不会经过回收站。 快照是 NameNode 做的事。它把创建快照那一刻的目录树记成元数据,此后无论什么被删除或修改,快照一侧的块都不会被删除。由于不复制数据,创建会立即完成;代价是被快照占着的那部分块,空间不会归还。 在生产环境中两者会一起使用。回收站挽回人的失误,快照挽回作业的失误(错误的 overwrite、被删除的分区)。差异报告(snapshotDiff)回答“从昨天起有什么变化”,distcp 的增量复制也用到它。

步骤

  1. 把 a.csv(即 /data/finance/q1.csv)、b.csv(即 q2.csv)、c.csv(即 /data/small/sensor-0000.csv)上传到 /snap/orders,并允许快照(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 末尾追加一行(-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 中写出 ## 휴지통、## 스냅샷、## 지킬 것 三个小节。第二节写入第 5 步差异报告的行数(不含表头行)。

参考

允许快照

创建 HDFS 的 /snap/orders,把 /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。

shell 的 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 占着这个文件的块,所以可以通过快照路径读取。快照是只读的,所以用的是 cp 而不是 mv。

两个快照之间的差异

像 echo 2026-03-01,s-9999,99.9 | hdfs dfs -appendToFile - /snap/orders/c.csv 这样,在 c.csv 中追加一行,创建快照 s2,然后把 hdfs snapshotDiff /snap/orders s1 s2 的输出保存到 /root/hdp/snap/diff.txt。

差异报告中的符号是 M(修改)、+(新增)、-(消失)、R(重命名)。请想一想 b.csv 为什么会以“-”和“+”出现两次——恢复回来的是同名的新文件。评分器会把 WebHDFS 的 GETSNAPSHOTDIFF 与你的文件逐行对照。

快照保护目录

执行 hdfs dfs -rm -r -skipTrash /snap/orders,并把错误输出保存到 /root/hdp/snap/deny.txt。/snap/orders 必须原样保留。

只要有一个快照,snapshottable 目录就不能被删除。删除目录是发给 NameNode 的一个请求,所以会被整体拒绝,里面的文件也原样保留。要删除,必须先删除全部快照(-deleteSnapshot),并撤销允许之后才行。

重命名快照

用 hdfs dfs -renameSnapshot /snap/orders s2 before-audit 把快照 s2 重命名为 before-audit。

快照名称如果按日期或事件来取,日后更容易找到。重命名之后,内容和差异报告保持不变。

记录两条恢复的路径

在 /root/hdp/snap/report.md 中写出 ## 휴지통、## 스냅샷、## 지킬 것 三个小节。第二节写入第 5 步差异报告的行数(去掉第一行表头之后的符号行数)。

请写出:回收站是谁的功能、什么时候没有用;快照记住了什么、占着什么;要保护这个文件夹,应该制定什么规则。