hdfs数据误删后恢复方式

本文详细介绍了Hadoop HDFS文件系统在数据误删后的恢复方法,包括使用HdfsTrash回收站功能和HdfsSnapShot快照机制。开启Trash功能可以在用户误删文件后提供恢复途径,而SnapShot则允许在特定时间点创建文件系统的快照,便于在数据丢失后恢复。如果直接通过API删除且未配置快照,恢复流程将更为复杂,需要立即停止服务,利用备份的元数据和block信息在新集群上重建数据。文章提供了详细的恢复步骤,强调了数据恢复的时间敏感性和操作的紧急性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道hdfs是hadoop体系上的文件系统,负责具体的数据文件存储,且如果一旦hdfs文件被误删除后,尤其是重要数据,对公司来说影响非常大。所以需要提前做一些安全预防措施,例如使用Hdfs Trash机制,或者重要目录应用Hdfs SnapShot功能,然后针对于删除的文件或者目录可以通过trash或者SnapShot机制来进行恢复,如果数据确实已经删除了(例如直接通过hadoop api进行delete,未配置SnapShot),如果想恢复数据,就需要快速采取一定的措施了。下面我们来分别介绍下这些恢复数据的使用方式与机制。

Hdfs Trash(回收箱)

对于线上生产环境的HDFS,开启回收站功能是必不可少的。该功能类似于linux系统的回收站设计,HDFS会为每个用户创建一个专属的回收站目录(/user/${user.name}/.Trash),用户删除文件时,实际上是被移动到了回收站目录。用于预防当用户误删HDFS上的数据时,能够及时从回收站恢复这些数据(当然回收站是防不住删库跑路的)。

使用这种方式的前提是在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目录下面。

Hdfs SnapShot(快照)

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

  • 快照创建瞬时性:除去inode的查询时间,算法消耗O(1)复杂度。

只有在对快照修改时才会消耗额外内存:内存使用O(M),M是被修改的文件或者目录数。

  • DataNode的block不被复制:快照文件记录block列表和文件大小。不做数据的拷贝复制。

  • 快照不会对正常HDFS操作产生不利影响:所有的修改都按照时间倒序排序,因此当前数据总能被直接访问到。快照数据是根据与当前数据进行变更部分的差值计算得来的。

使用实例:

使用方式:#创建快照:hdfs fs  -allowSnapshot  /testhdfs fs -put  test.txt   /testhdfs fs  -createSnapshot  /test   import_data #将test文件删除:hdfs fs -rmr  /test/test.txt #误删除后就可以使用快照目录进行恢复:hdfs  fs  -cp /test/.snapshot/import-data/test.txt  /text

恢复数据

然而如果直接调用hadoop delete api进行删除操作,是默认不会走trash机制的,同时也未配置快照功能的情况下,文件所对应的block数据已经开始真正从底层文件系统层面进行删除,此时需要快速的做出决断进行恢复操作。因为需要停止数据服务(nn、dn),所以需要综合考虑,去权衡恢复数据和停服对线上服务的影响两者之间的利害关系。

首先梳理下hdfs delete的流程,如下图:

我们可以看到hdfs delete流程中很多环节都是异步进行操作的,所以如果想恢复数据,需要立即做出决定是否进行停服,可以恢复的数据量也取决于操作与停服间隔时间,还有集群的繁忙程度,所以可能恢复全部或者部分数据,如果时间过了很久了,在集群规模比较大、集群比较空闲的情况下,可恢复的数据量百分比就不能太乐观了。下面我们来说明下具体恢复步骤(说明:操作的前提是有删除操作之前的fsimage元数据,同时需要有备用的新集群):

1. 及时停止hdfs集群服务(nn、dn),阻止block数据从os上进一步被删除;

由上述的hdfs delete流程可知namenode删除block指令是通过datanode心跳一批批下发的,且datanode是通过异步线程删除block数据, 所以需要立即停止服务进程,阻止datanode上的block文件进一步被删除;

2. 拷贝删除数据前的元数据fsimage文件,并在新集群namenode加载

2.1) 通过hdfs审计log找到删除操作开始的确切时间点;

2.2) 从fsimage备份的多个版本中,找到删除操作时间点前的fsimage;

2.3) 停掉新集群所有进程(保留journalnode),初始化新环境;

2.4) 停掉所有journalnode进程,在image目录替换为备份的fsimage文件,替换imaeg、edits、和所有journalnode目录下的VERSION文件为生产环境上的VERSION文件;

2.5) 启动namenode进程;

3. 用fsck在新集群namenode获取数据块blockid,生成列表文件

./bin/hadoop fsck 误删目录  -files -blocks  (通过脚本生成blockid列表文件)

4. 从原集群datanode上拷贝blockid对应的文件到新集群datanode

4.1) 在原集群每个datanode上生成要拷贝的blockid文件目录列表(编写脚本通过ancible执行)

4.2) 统计可以检索出来的存在的blockid文件数量(按照blockid去重)和总blockid数量的比例,根据比例情况判断数据恢复操作是否继续进行;

4.3) 在原集群每个datanode上拷贝blockid对应文件到新集群datanode(编写脚本通过ancible执行,scp,如果有多副本需要copy到不同datanode节点上)

4.4) 对比验证copy到新集群datanode节点上文件数量;

5. 启动新集群datanode,检查新集群恢复的数据量,文件数据可用性

5.1) 启动新集群上所有datanode;

5.2) 检查恢复的文件数据量,测试文件数据的可用性

6. 恢复老集群服务

启动hdfs集群所有节点的服务进程;

7.从新集群distcp hdfs文件回老集群 

以上就是关于hdfs数据误删后数据恢复的步骤,有疑问或者错误的地方的欢迎沟通和指正。

### Hive 中 Truncate 命令误删数据后的恢复方法 对于通过 `TRUNCATE` 命令清空的 Hive 表,由于该命令会直接清除表中的所有数据而不会移动到回收站,因此常规情况下这些数据无法像 DROP 的表那样容易恢复[^1]。 然而,在某些特定条件下仍有可能尝试恢复: #### 尝试从 HDFS 日志中查找残留数据 虽然 `TRUNCATE` 不会将旧版本的数据放入垃圾箱,但在极少数情况下,部分未及时清理的日志文件可能还保存着被截断之前的数据副本。这取决于具体集群配置以及日志保留策略[^4]。 ```bash hdfs dfs -ls /path/to/table/directory/_logs/ ``` 请注意上述路径需替换为实际存储位置,并且这种方法成功率较低。 #### 利用备份机制 如果所在环境启用了自动定期全量或增量备份,则可以从最近一次完整的备份集中提取丢失的信息并重新导入至当前数据库实例内[^2]。 #### 数据库快照功能(适用于支持此特性的发行版) 一些企业级大数据平台提供了更高级别的保护措施如时间点恢复(PITR),允许管理员回滚到指定历史时刻的状态从而挽救意外损失的内容[^3]。 尽管存在以上几种理论上的解决方案,但针对由 TRUNCATE 导致的数据遗失情况而言,最有效的预防手段始终在于事前准备——即建立完善的事先防范体系,包括但不限于启用事务管理、设置合理的权限控制政策等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值