HDFS误操作删除文件 文件夹的恢复方式

我们每天都可能会操作 HDFS 上的文件,这就很难避免误操作,比如比较严重的误操作就是删除文件。本文针对这个问题提供了三种恢复误删除文件的方法,希望对大家的日常运维有所帮助。


通过垃圾箱恢复

HDFS 为我们提供了垃圾箱的功能,也就是当我们执行 hadoop fs -rmr xxx 命令之后,文件并不是马上被删除,而是会被移动到执行这个操作用户的 .Trash 目录下,等到一定的时间后才会执行真正的删除操作。看下下面的例子:


640?wx_fmt=png&wxfrom=5&wx_lazy=1

从上面的例子中可以看出,我们删了 test.txt 文件之后,文件被移到 /user/iteblog/.Trash/Current/user/iteblog/test.txt 路径下,如果这个操作属于误操作,那么我们可以到回收站找回这个文件并直接 mv 回原来的目录即可恢复之前的数据。不过这个功能的前提是要求我们启用 fs.trash.interval 参数,默认是 0 代表不启用垃圾箱功能。


640?wx_fmt=png&wxfrom=5&wx_lazy=1

上面的配置是说,文件被删除会保留到 .Trash 目录下一天,超过这个时间被删除的文件就会真正被删除。所以为了误删除操作,强烈建议开启 HDFS 回收站功能。

通过快照恢复

Hadoop 从 2.1.0 版本开始提供了 HDFS 快照(SnapShot)功能。一个快照是一个全部文件系统、或者某个目录在某一时刻的镜像。利用快照可以防止用户错误操作,管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行恢复。下面我们来实操说明如何利用快照恢复误删除的文件:

创建目录和文件


0?wx_fmt=png

上面我们创建了 /user/iteblog/important/ 目录,里面有一个文件 important-file.txt ,假设这个文件是非常重要的。

创建快照

0?wx_fmt=png

现在我们已经为 important 目录创建了快照,名称为 important-snapshot。

误删除操作

因为开启了快照功能,我们无法删除已经创建快照的目录(/user/iteblog/important),但是我们依然可以删除这个目录下的文件;

0?wx_fmt=png

现在这个重要的文件被我们误删除了!

恢复文件

别急,因为我们开启了快照,所有我们可以从快照中恢复这个文件,步骤如下:

0?wx_fmt=png

通过上面几步,我们已经恢复了误删除的重要文件。

通过编辑日志恢复

关于 Hadoop 的编辑日志介绍请参见:《Hadoop文件系统元数据fsimage和编辑日志edits》。如果你的 Hadoop 集群没有开启回收站功能,也没有对重要的数据创建快照,这时候如果有人将一份非常重要的数据误删除了,那我们如何恢复这些数据?答案是通过修改编辑日志,但是通过这种方法不一定能恢复已经被删除的文件,或者只能恢复一部分被删除的文件,也可能恢复全部误删除的数据,这个和你的集群繁忙状态有很大的关系。而且通过这种方式恢复误删除的文件代价很高,风险很大,需要谨慎使用。下面我来介绍通过这种恢复删除数据的步骤。

删除文件


0?wx_fmt=png

由于上面删除操作使用了 -skipTrash 参数,这意味着这个文件会被直接删除,并不会先放到回收站。

恢复数据

NameNode 在收到删除命令时,会先将这个命令写到编辑日志中,然后会告诉 DataNode 执行真正的文件删除操作。所以我们需要做的是立刻停止 NameNode 和 DataNode 节点,阻止删除命令的执行。然后找到执行 rmr 操作发生时间对应的编辑日志,假设是 edits_inprogress_0000000000000001512,这个文件是二进制的形式,我们需要通过 HDFS 自带的命令将这个文件转换成可读的形式,如下:

0?wx_fmt=png

最后启动 NameNode 和 DataNode 节点,后面就看你的造化了。


猜你喜欢

转载自blog.csdn.net/yisun123456/article/details/80593958