恢复HDFS上误删除的文件

1. 通过回收站恢复

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

$ hadoop fs -rmr /user/iteblog/test.txt
Moved: 'hdfs://iteblogcluster/user/iteblog/test.txt' to trash at: hdfs://iteblogcluster/user/iteblog/.Trash/Current
$ hadoop fs -ls /user/iteblog/.Trash/Current/user/iteblog
-rw-r--r--   3 iteblog iteblog  103 2017-05-15 17:24 /user/iteblog/.Trash/Current/user/iteblog/test.txt
$ hadoop fs -mv /user/iteblog/.Trash/Current/user/iteblog/test.txt /user/iteblog/
$ hadoop fs -ls /user/iteblog/test.txt
-rw-r--r--   3 iteblog iteblog  103 2017-05-15 17:24 test.txt

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

<property>
    <name>fs.trash.interval</name>
    <value>1440</value>
    <description>
        Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled. This option may
        be configured both on the server and the client. If trash is disabled server side then the client side configuration
        is checked. If trash is enabled on the server side then the value configured on the server is used and the client
        configuration value is ignored.
    </description>
</property>

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

2. 通过快照恢复

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

  1. 创建目录和文件

    $ hadoop fs -mkdir /user/iteblog/important/
    $ echo "important data" | hadoop fs -put - /user/iteblog/important/important-file.txt
    $ hadoop fs -cat /user/iteblog/important/important-file.txt
    important data
    

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

  1. 创建快照

    $ hadoop dfsadmin -allowSnapshot /user/iteblog/important
    $ hadoop fs -createSnapshot /user/iteblog/important important-snapshot
    

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

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

    $ hadoop fs -rm -r /user/iteblog/important/important-file.txt
    

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

  1. 恢复文件
    由于我们开启了快照,所以我们可以从快照中恢复这个文件,步骤如下:

    $ hadoop fs -ls /user/iteblog/important/.snapshot/
    $ hadoop fs -cp /user/iteblog/important/.snapshot/important-snapshot/important-file.txt /user/iteblog/important/
    $ hadoop fs -cat /user/iteblog/important/important-file.txt
    important data
    

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

3. 通过编辑日志恢复

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

  1. 删除文件

    $ hadoop fs -rmr -skipTrash /user/iteblog/important-file.txt
    

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

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

    $ hdfs oev -i edits_inprogress_0000000000000001512 -o edits_inprogress_0000000000000001512.xml
    

    上面执行的结果是二进制的编辑日志被转换成我们人类可读的xml格式的文件,我们找到执行删除 important-file.txt 文件的命令记录:

    <RECORD>
        <OPCODE>OP_DELETE</OPCODE>
        <DATA>
            <TXID>1624</TXID>
            <LENGTH>0</LENGTH>
            <PATH>/user/iteblog/important-file.txt</PATH>
            <TIMESTAMP>1515724198362</TIMESTAMP>
            <RPC_CLIENTID>34809cac-a89f-4113-98b5-10c54d7aac1a</RPC_CLIENTID>
            <RPC_CALLID>1</RPC_CALLID>
        </DATA>
    </RECORD>
    

    OP_DELETE 这个标记就是删除操作,我们将这个标记修改成比较安全的操作(比如OP_SET_PERMISSIONS),如果这个命令是在最后,可以直接删除,然后保存。再将修改后的编辑日志转换成计算机能够识别的格式:

    $ hdfs oev -i edits_inprogress_0000000000000001512.xml -o edits_inprogress_0000000000000001512 -p binary
    

最后启动 NameNode 和 DataNode 节点,至于文件是否能够恢复,就听天由命了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您可以使用以下命令来查看HDFS上的文件和路径: - 查看根目录及其子目录:`hdfs dfs -ls /` - 查看指定目录及其子目录:`hdfs dfs -ls /path/to/directory` - 查看指定文件的信息:`hdfs dfs -ls /path/to/file` 其中,`-ls`选项用于列出目录或文件的详细信息,包括权限、拥有者、大小、修改日期等。如果您只想查看文件或目录的名称,可以使用`-ls`选项和`awk`命令来提取出名称信息: - 查看根目录及其子目录的名称:`hdfs dfs -ls / | awk '{print $NF}'` - 查看指定目录及其子目录的名称:`hdfs dfs -ls /path/to/directory | awk '{print $NF}'` - 查看指定文件的名称:`hdfs dfs -ls /path/to/file | awk '{print $NF}'` ### 回答2: 要查看HDFS上有哪些文件和路径,可以使用以下几种方法: 1. Hadoop命令行界面(CLI):在命令行中输入`hadoop fs -ls /`,其中`/`是根目录,可以替换为其他目录路径。这将显示出该目录下的所有文件和子目录。 2. Hadoop Web浏览器界面:打开Hadoop集群的Web界面,通常为`http://<Hadoop集群的主机名>:<端口号>`。在界面中导航到文件浏览器(File Browser)或文件管理器(File Manager),即可显示HDFS上的文件和路径。 3. Hadoop API:可以使用Hadoop提供的Java API来编写程序,实现查询HDFS上的文件和路径。具体可以使用`FileSystem`类的`listStatus()`方法来获取指定路径下的文件和目录的详细信息。 示例代码如下: ``` import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; public class HdfsFileViewer { public static void main(String[] args) { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(conf); FileStatus[] status = fs.listStatus(new Path("/")); for (FileStatus file : status) { System.out.println(file.getPath()); } } catch (Exception e) { e.printStackTrace(); } } } ``` 以上是三种常用的方法,根据实际需要选择其中一种或多种方法来查看HDFS上的文件和路径。 ### 回答3: 要查看HDFS上的文件和路径,可以使用以下几种方法: 1. 使用Hadoop命令行界面: 在Hadoop安装目录下的bin文件夹中,使用命令`hadoop fs -ls /`可以列出根目录下的所有文件文件夹。使用`hadoop fs -ls /path`可以列出指定路径下的所有文件文件夹。 2. 使用Hadoop Web UI: 在Web浏览器中输入Hadoop集群的地址,并加上端口号,默认情况下为50070。然后选择“浏览文件系统”选项,在此界面上可以浏览和查看HDFS上的文件文件夹,包括其路径和属性等信息。 3. 使用Hadoop文件浏览器: 在Web浏览器中输入Hadoop集群的地址,并加上端口号,默认情况下为50075。然后选择“文件浏览器”选项,可以在此界面上搜索、查看和操作HDFS上的文件文件夹。 4. 使用HDFS Shell命令: 在Hadoop安装目录下的bin文件夹中,使用命令`hdfs dfs -ls /`可以列出根目录下的所有文件文件夹。使用`hdfs dfs -ls /path`可以列出指定路径下的所有文件文件夹。 无论使用哪种方法,都可以轻松地查看HDFS上的文件和路径。这些方法不仅适用于查看文件和路径,还可以用于搜索、复制、移动和删除等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第一片心意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值