删了HDFS又能怎样?记一次删库不跑路事件

本文记录了一次由于误操作导致的HDFS数据删除事件,详细介绍了从事发背景、应急措施到分析过程和最终的数据恢复方案。强调了权限控制和操作规范的重要性,并提供了宝贵的故障恢复经验。
摘要由CSDN通过智能技术生成

一、事发背景

上个月的某一天,由于集群空间不足,公司有一位权限较高的员工通过跳板机在某个线上集群执行手动清理命令,疯狂地执行hadoop fs -rmr -skipTrash /user/hive/warehouse/xxxxx,突然,不知道是编辑器的问题还是换行问题,命令被截断,命令变成了hadoop fs -rmr -skipTrash /user/hive/warehouse,悲剧此刻开始发生!?

/user/hive/warehouse目录下存储了所有hive表的数据,关联公司多个业务线,一旦丢失,意味着巨大的损失。由于加了-skipTrash参数,意味着删除的数据不会放入回收站而是直接删除,这个参数不加的话很容易挽回,回收站里直接找,可惜逃不了墨菲定律,最担心的事还是发生了。

领导解决不了的事,只有小弟上,看我接下来怎样四两拨千斤。

二、应急措施

运维第一时间找到我,当时说误删了 /user/hive/warehouse目录。当时我也是一震惊,完了完了!凭我仅有的直觉,立马停掉了HDFS集群!后面证明是很明智的选择。

直观的方案

  1. 通过快照恢复?hdfs快照从来没用过,也没创建过快照,所以此路不通
  2. 通过回收站恢复?删除时加了-skipTrash参数,不会放回收站,此路也不通
  3. 删库跑路成为一代传奇人物?嗯,还不错

三、分析过程

想要恢复数据,首先要理解hdfs删除文件的过程,各个文件系统的删除逻辑都不一样,理解了hdfs的删除过程,才知道上面那一条hadoop fs -rmr xxxx究竟干了什么,究竟还有没有救,怎么去救等等问题。

  • hdfs文件删除过程

    下面是hdfs删除路径的方法,源码路径org.apache.hadoop.hdfs.server.namenode.FSNamesystem.delete()

      boolean delete(String src, boolean recursive, boolean logRetryCache)
          throws IOException {
        waitForLoadingFSImage();
        BlocksMapUpdateInfo toRemovedBlocks = null;
        writeLock();
        boolean ret = false;
        try {
          checkOperation(OperationCategory.WRITE);
          checkNameNodeSafeMode("Cannot delete " + src);
          toRemovedBlocks = FSDirDeleteOp.delete(        // @1
              this, src, recursive, logRetryCache);
          ret = toRemovedBlocks != null;
        } catch (AccessControlException e) {
          logAuditEvent(false, "delete", src);
          throw e;
        } finally {
          writeUnlock();
        }
        getEditLog().logSync();
        if (toRemovedBlocks != null) {
          removeBlocks(toRemovedBlocks);   // @2
        }
        logAuditEvent(true, "delete", src);
        return ret;
      }
    
    

    代码@1里面做了三件比较重要的事

    ①从NameNode维护的的目录树里面删除路径,这也是为什么执行删除操作之后就无法再通过hadoop fs -ls xxx或其它api方式再查看到路径的根本原因

    ②找出被删路径关联的block信息,每个文件包含多个block块,分布在各个DataNode,此时并未真正物理删除DataNode上物理磁盘上的block块

    ③记录删除日志到editlog(这一步也很重要,甚至是后面恢复数据的关键)

    代码@

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HDFSHadoop Distributed File System)是Hadoop生态系统中的一种分布式文件系统,它的设计目标是能够在廉价的硬件上存储大量数据,并且保证高可靠性和高性能。 HDFS将大文件划分为若干个数据块(默认大小为64M),并将这些数据块分散存储在不同的节点上,这些节点可以是集群中的任何一台机器。每个数据有多个备份(默认为3份),这些备份存储在不同的节点上,以保证数据的可靠性。HDFS通过数据块的复制策略,将数据块尽可能地分散存储在不同的机器上,以保证数据的可靠性和高效性。当某个节点失效时,HDFS自动将该节点上的数据块复制到其他节点上,保证数据的可靠性。 在HDFS中,数据的存储是通过NameNode和DataNode来实现的。NameNode是整个HDFS的管理节点,它负责管理文件系统的命名空间、文件元数据信息、数据块的分布情况等。DataNode是存储数据块的节点,它负责存储数据块、向NameNode汇报数据块的存储信息等。 在HDFS中,当一个客户端需要存储一个文件时,它将文件切分成若干个数据块,并将这些数据块分散存储在不同的DataNode上。同时,客户端向NameNode发送一个请求,将文件的元数据信息存储在NameNode上。当客户端需要读取文件时,它向NameNode发送一个请求,获取文件的元数据信息,然后通过DataNode获取数据块,并将这些数据块组成完整的文件返回给客户端。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值