如何有效恢复误删的HDFS文件
HDFS是大数据领域比较知名的分布式存储系统,作为大数据相关从业人员,每天处理HDFS上的文件数据是常规操作。这就容易带来一个问题,实际操作中对重要数据文件的误删,那么如何恢复这些文件,就显得尤为重要。
本文针对误删HDFS文件的问题,通过利用HDFS的内部机制,提供了以下几种方法:
1. 回收站机制恢复
HDFS提供了回收站功能,当我们执行hdfs dfs -rm -r some_file命令后,文件不会被立即删除。而是先将要删除的数据移动到当前用户的.Trash目录下,待超过一定时间(可通过参数配置)后才会真正执行删除的操作。
首先看个例子:
[root@bigdatalearnshare-3 ~]# hdfs dfs -rm -r /bigdatalearnshare/test/stats.json
20/07/24 16:42:35 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 360 minutes, Emptier interval = 0 minutes.
20/07/24 16:42:35 INFO fs.TrashPolicyDefault: Moved: 'hdfs://bigdatalearnshare-1:9000/bigdatalearnshare/test/stats.json' to trash at: hdfs://bigdatalearnshare-1:9000/user/root/.Trash/Current/bigdatalearnshare/test/stats.json
Moved: 'hdfs://bigdatalearnshare-1:9000/bigdatalearnshare/test/stats.json' to trash at: hdfs://bigdatalearnshare-1:9000/user/root/.Trash/Current
从上面的例子可以看出,我们在删除文件stats.json时,stats.json会被移到/user/root/.Trash/Current目录下:
[root@bigdatalearnshare-3 ~]# hdfs dfs -ls /user/root/.Trash/Current/bigdatalearnshare/test
Found 1 items
-rw-r--r-- 1 root supergroup 147 2020-07-24 16:42 /user/root/.Trash/Current/bigdatalearnshare/test/stats.json
如果我们删除该文件的操作为误操作,此时HDFS的回收站机制就发挥重大作用了。我们只需到回收站中找到误删的文件,然后移动(mv)到原来的目录,即可恢复误删的数据。
注意:HDFS的回收站机制默认是关闭的,需要我们在配置文件core-site.xml中配置一些参数,具体如下:
<property>
<name>fs.trash.interval</name>
<value>360</value>
<description>检查点被删除后的分钟数。如果为零,垃圾桶功能将被禁用。
该选项可以在服务器和客户端上配置。如果垃圾箱被禁用服务器端,则检查客户端配置。
如果在服务器端启用垃圾箱,则会使用服务器上配置的值,并忽略客户端配置值。
</description>
</property> <property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
<description>垃圾检查点之间的分钟数。应该小于或等于fs.trash.interval。
如果为零,则将该值设置为fs.trash.interval的值。每次检查指针运行时,
它都会从当前创建一个新的检查点,并删除比fs.trash.interval更早创建的检查点。
</description>
</property>
注意:通过回收站恢复误删的数据,要求时间不能超过fs.trash.interval配置的时间。
生产中为了防止误删数据,建议开启HDFS的回收站机制
2. 快照机制恢复
HDFS快照是文件系统的只读时间点副本。可以在文件系统的子树或整个文件系统上创建快照。
一个快照是一个全部文件系统、或者某个目录在某一时刻的镜像。快照的一些常见用例是数据备份,利用快照可以对重要数据进行恢复,防止用户错误性的操作,管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行恢复。
HDFS的快照的特征如下:
快照的创建是瞬间的,代价为O(1),取决于子节点扫描文件目录的时间
当且仅当做快照的文件目录下有文件更新时才会占用小部分内存,占用内存的大小为O(M),其中M为更改文件或者目录的数量
新建快照的时候,Datanode中的block不会被复制,快照中只是记录了文件块的列表和大小信息快照不会影响正常的HDFS的操作
- 对做快照之后的数据进行的更改将会按照时间顺序逆序的记录下来,用户访问的还是当前最新的数据,快照里的内容为快照创建的时间点时文件的内容减去当前文件的内容
下面我们来实操说明如何利用快照恢复误删除的文件:
创建快照:
为目录/bigdatalearnshare/snapshot创建名为snapshot-test的快照:
[root@bigdatalearnshare-3 ~]# hdfs dfsadmin -allowSnapshot /bigdatalearnshare/snapshot
Allowing snaphot on /bigdatalearnshare/snapshot succeeded
[root@bigdatalearnshare-3 ~]# hdfs dfs -createSnapshot /bigdatalearnshare/snapshot snapshot-test
Created snapshot /bigdatalearnshare/snapshot/.snapshot/snapshot-test
误删除操作:
因为我们为/bigdatalearnshare/snapshot创建了快照,此时我们无法删除该目录:
[root@bigdatalearnshare-3 ~]# hdfs dfsadmin -allowSnapshot /bigdatalearnshare/snapshot
Allowing snaphot on /bigdatalearnshare/snapshot succeeded
[root@bigdatalearnshare-3 ~]# hdfs dfs -createSnapshot /bigdatalearnshare/snapshot snapshot-test
Created snapshot /bigdatalearnshare/snapshot/.snapshot/snapshot-test
但是我们可以hdfs dfs -rm -r命令该目录下文件。
如果此时,我们误删了该目录下的重要文件,我们就可以通过快照机制进行文件的恢复。具体如下:
[root@bigdatalearnshare-3 ~]# hdfs dfs -rm -r /bigdatalearnshare/snapshot
20/07/24 17:06:52 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 360 minutes, Emptier interval = 0 minutes.
rm: Failed to move to trash: hdfs://bigdatalearnshare-1:9000/bigdatalearnshare/snapshot: The directory /bigdatalearnshare/snapshot cannot be deleted since /bigdatalearnshare/snapshot is snapshottable and already has snapshots
注意:快照机制进行文件的恢复,我们要用cp命令,不能用mv,因为快照在这里是只读的。
[root@bigdatalearnshare-3 ~]# hdfs dfs -mv /bigdatalearnshare/snapshot/.snapshot/snapshot-test/stats.json /bigdatalearnshare/snapshot
mv: Modification on a read-only snapshot is disallowed
3. 编辑日志(edits)恢复
通过编辑日志恢复HDFS文件,适用于Hadoop集群没有开启回收站机制,也没有对重要数据进行快照处理的场景。
但是这种方式存在很大弊端,文件的恢复存在以下几种情况:
1)全部恢复
2)部分恢复
3)完全没有回复
这个主要和集群的繁忙状态有很大关系。而且通过这种方式恢复误删文件的代价很高,具体看以下介绍:
删除文件:
因为刚才开启了HDFS回收站机制,为了模拟文件被立刻删除的情况,此处通过指定-skipTrash参数跳过回收站回收:
hdfs dfs -rm -r -skipTrash /bigdatalearnshare/testlog/stats.json
恢复数据:
NameNode在收到删除命令时,会先将这个命令写到edits中,然后会告诉DataNode执行真正的文件删除操作。
所以我们在误删文件后,需要做的是立刻停止NameNode和DataNode节点,阻止删除命令的执行。然后找到执行删除操作发生时间对应的edits日志。
本次测试时,edits文件为edits_inprogress_0000000000000003454,该文件是二进制的形式,我们可以通过HDFS命令将这个文件转换成可读的xml形式,如下:
hdfs oev -i edits_inprogress_0000000000000003454 -o edits_inprogress_0000000000000003454.xml
在edits_inprogress_0000000000000003454.xml中查找删除/bigdatalearnshare/testlog下文件stats.json的命令记录:
<EDITS>
<RECORD>
<OPCODE>OP_DELETE</OPCODE>
<DATA>
<TXID>3462</TXID>
<LENGTH>0</LENGTH>
<PATH>/bigdatalearnshare/testlog/stats.json</PATH>
<TIMESTAMP>1595582828526</TIMESTAMP>
<RPC_CLIENTID>dd918895-1482-4b0a-ab8e-d3b2b87c430d</RPC_CLIENTID>
<RPC_CALLID>1</RPC_CALLID>
</DATA>
</RECORD>
</EDITS>
OP_DELETE代表删除操作,我们可以将这个标记修改为安全的操作(如OP_SET_PERMISSIONS),如果这个命令在最后,可以直接删除,然后保存。再将修改后的编辑日志转换成计算机能够识别的格式:
hdfs oev -i edits_inprogress_0000000000000003454.xml -o edits_inprogress_0000000000000003454 -p binary
最后再启动NameNode和DataNode节点,查看误删文件的恢复情况。
关联文章:
关注微信公众号:大数据学习与分享,获取更对技术干货
如何有效恢复误删的HDFS文件的更多相关文章
- git恢复误删文件及省去密码提交
自己遇到这种情况:自己将某文件在网页的控制面板上直接删除了,再pull下来.或者一个成员误删除了某个文件,然后push到远程库了,其他成员也都pull了,结果就是所有人的本地库当前版本中这个文件都不见 ...
- eclipse如何恢复误删文件
刚刚真的要吓死宝宝了,不是说宝宝心里素质差,是因为刚刚误删的文件实在是太重要了,废话不多说了,正题 如何恢复eclipse误删的文件 1,当时被误删了,可立即 Ctrl+z 即可恢复误删文件; 2,时 ...
- 【转载】恢复误删文件--DOS命令应用实例(一)
<电脑爱好者>报转载第一辑第二篇之恢复误删文件--DOS命令应用实例(一) 恢复误删文件--DOS命令应用实例(一) 上期我们讲述了 ...
- Hadoop如何恢复被删除的文件
hadoop的hdfs中被删除文件的恢复原理和回收站原理是一样的,就是在删除hdfs文件时,被删除的文件被移动到了hdfs的.Trash文件夹中,恢复时只需将该文件夹中文件拿出即可.具体操作如下: 1 ...
- HDFS 文件读写过程
HDFS 文件读写过程 HDFS 文件读取剖析 客户端通过调用FileSystem对象的open()来读取希望打开的文件.对于HDFS来说,这个对象是分布式文件系统的一个实例. Distributed ...
- 非常有用!eclipse与myeclipse恢复已删除的文件和代码
eclipse与myeclipse恢复已删除的文件和代码 今天写了1300多行代码,被不小心删除了顿时感觉手足无措,后来用myeclipse的历史文件恢复功能,找回来了,虚惊一场!!!MyEclip ...
- myeclipse如何恢复已删除的文件和代码
这是一篇文章分享秘诀:myeclipse恢复意外删除的文件和代码 [ 恢复误删文件 ] 今天在写代码的时候,不小心把一个包给删除了,然后这个包下全部的文件都没了,相信非常多人都有类似的经历. 幸好my ...
- PostgreSQL恢复误删数据
在Oracle中:删除表或者误删表记录:有个闪回特性,不需要停机操作,可以完美找回记录.当然也有一些其他的恢复工具:例如odu工具,gdul工具.都可以找回数据.而PostgreSQL目前没有闪回特性 ...
- 几种访问HDFS文件的客户端的总结
HDFS是英文Hadoop Distributed File System的缩写,中文翻译为Hadoop分布式文件系统,它是实现分布式存储的一个系统,所以分布式存储有的特点,HDFS都会有,HDFS的 ...
随机推荐
- python创建Django项目
创建Django项目 关注公众号"轻松学编程"了解更多. 创建一个HelloDjango项目 GitHub地址:https://github.com/liangdongchang/ ...
- Maven的介绍及使用
一.Maven简介 Maven 是一个项目管理工具,可以对 Java 项目进行构建.依赖管理,是一个自动化构建工具. 自动化构建工具:将原材料(java.js.css.html....)->产品 ...
- 联发科Mediatek工业路由芯片上网稳定低功耗的Router模块WiFi中继——无线AP定制方案
Router模块又名路由器模块,是指将路由器的接口类型及部分扩展功能是可以根据实际需求来进行无线接入服务,允许其他无线设备接入,通过局域无线端或联网远程端,进行数据访问,对无线设备进行远程控制.常见的 ...
- 1到n整数中1出现的次数
1到n整数中1出现的次数 题目描述 输入一个整数n, 求1~n这n个整数的十进制表示中1出现的次数. 例如, 输入12, 1~12这些整数中包含1的数字有1, 10, 11和12, 1一共出现了4次 ...
- 天啦撸!打印日志竟然只晓得 Log4j?
空了的时候,我都会在群里偷偷摸摸地潜水,对小伙伴们的一举一动.一言一行筛查诊断.一副班主任的即时感,让我感到非常的快乐,略微夹带一丝丝的枯燥. 这不,我在战国时代读者群里发现了这么一串聊天记录: 竟然 ...
- SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)
SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂) 1.SpringBoot整合Druid Druid是阿里巴巴的一个开源项目,是一个数据库连接池的实现,结合了C3P0. ...
- strace 使用文档
strace -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filenam ...
- <连接器和加载器>——概述连接器和加载器
0.涉及术语 (1)地址绑定 将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定. (2)符号解析 程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分 ...
- p5.js基本[一] T型高斯分布的小星星
样例 <script src="./p5/p5.js"></script> <script> function setup() { // 只写一 ...
- Elementary OS安装及开发环境配置(一)
前言 假期在家无聊,刚好把六年前的一台笔记本电脑利用起来,原来电脑虽然说配置说不上古董机器,但是运行win系统感觉还是不流畅,所幸给换成Linux桌面版系统,在网上查阅了很多,Linux桌面系统要么推 ...