HDFS恢复误删操作的方法

时间:2024-03-08 08:06:37

1、通过垃圾箱恢复

使用这种方式的前提是在hdfs上面开启trash功能,默认是没有开启的。interval的值默认为0,单位是分钟。只需要在hadoop的配置文件core-site.xml中添加下面的内容:

<!--Enable Trash -->

<property>

      <name>fs.trash.interval</name>

      <value>120</value>

</property>

<property>

      <name>fs.trash.checkpoint.interval</name>

      <value>120</value>

</property>

添加好上述内容后,不需要重启后台程序,直接就会生效。

执行删除操作后,会先将文件移动到当前操作用户的.Trash/Current目录下面。例如:

[root@spark hadoop]# hdfs dfs -rm -r /widow
18/01/15 15:54:49 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 120 minutes, Emptier interval = 120 minutes.
Moved: \'hdfs://spark:9000/widow\' to trash at: hdfs://spark:9000/user/root/.Trash/Current

我这里是以root用户进行操作的,所以HDFS上面上的路径/user/root/.Trash/Current

恢复:

#hdfs dfs -mv /user/root/.Trash/Current/widow   /

如果确定要删除的文件,直接将文件或目录drop掉,不放到trash里面,删除的时候使用参数-skipTrash:

#hdfs dfs -rm -r  -skipTrash  /widow 

 

2、通过快照恢复

hadoop从2.1版本后开始支持HDFS快照(SnapShot)功能,

  • 快照创建瞬时性:除去inode的查询时间,算法消耗O(1)复杂度。
  • 只有在对快照修改时才会消耗额外内存:内存使用O(M),M是被修改的文件或者目录数。
  • DataNode的block不被复制:快照文件记录block列表和文件大小。不做数据的拷贝复制。
  • 快照不会对正常HDFS操作产生不利影响:所有的修改都按照时间倒序排序,因此当前数据总能被直接访问到。快照数据是根据与当前数据进行变更部分的差值计算得来的。

创建快照前要先对目录进行检查是否可以创建快照:

#hdfs lsSnapshottableDir

一个可以快照的目录最多可以允许同时65536个快照同时存在,嵌套的可快照目录目前还不允许

管理员操作:

1)允许快照:

    #hdfs  dfsadmin  -allowSnapshot  <path>

   path即想创建快照的目录的路径。通过上述命令将一个目录变成可快照的目录。

2)创建快照

一般使用普通用户操作,此用户需要有操作可快照目录的权限,最好是该目录的owner。管理员可以进行任何操作。

   #hdfs  dfs  -createSnapshot  <path>  [<snapshotName>]

  <path>可快照目录的路径,<snapshotName>快照的名称,可以不写,默认会生成一个格式为\'s\'yyyyMMdd-HHmmss.SSS

3)删除快照

  # hdfs  dfs -deleteSnapshot  <path>  <snapshotName>

  <path>可快照目录的路径 ,<snapshotName>快照的名称

4)重命名快照

 # hdfs  dfs  -renameSnapshot  <path>  <oldname>   <newname>

 <path>可快照目录的路径,<oldname>老名字, <newname>新名字

5)获取可快照目录的信息

# hdfs  lsSnapshottableDir

6)获取快照的差异报告

#hdfs  snapshotDiff  <path> <fromSnapshot>  <toSnapshot>

<path>可快照目录的路径,<fromSnapshot>源快照名,<toSnapshot>目的快照名

结果:

+ 文件或目录被创建。
- 文件或目录被删除。
M 文件或目录被修改。
R 文件或目录被重命名。

 

已经创建快照的目录无法被删除,只有删除该目录下的所有快照,才允许删除这个目录。

 

使用方式:

1)创建快照:

 #hdfs dfsadmin  -allowSnapshot  /widow

 #hdfs dfs -put  test.txt   /widow

 #hdfs  dfs  -createSnapshot  /widow   import-data

 将test文件删除:

 #hdfs  dfs -rm -r  /widow/test.txt

误删除后就可以使用快照目录进行恢复:

 #hdfs  dfs  -cp  -ptopax /widow/.snapshot/import-data/test.txt  /widow