一次HDFS Snapshot无法删除的问题排查

前言


众所周知,HDFS有一个十分有用的Snapshot的功能,可以用来保护数据被误删除的情况。可能有人会说了,数据被删除了,我难道不可以从trash目录里把数据再恢复回去吗?HDFS的Snapshot和我们平常说的数据删除进trash目录不太一样,HDFS删除操作进trash目录是一个延时操作的删除策略。如果遇到用户实际执行真正删除的数据操作行为时(这里的指的是这个数据彻底从namespace层面移除掉,连trash里都不存在了),假设我们对数据启用了Snapshot保护的话,这个时候恢复的途径,就能够从HDFS的Snapshot里恢复了。不过从Snapshot进行数据恢复的话,这里会涉及到实际物理数据的拷贝,而不是一个简单的从snapshot目录rename到实际删除掉的路径上去的一个动作。在这点上,snapshot和trash的恢复处理还是有区别的。本文笔者来分享一次我们内部集群发生的HDFS Snapshot无法删除的问题,整个问题的排查过程时间线拉的比较长,中间也是一度绕了很多弯路。

背景


我们内部集群使用HDFS Snapshot的策略是采用daily snapshot的策略进行数据的保护的。简单来说,就是我们只保护24小时以内发生的数据误删行为,如果是超出这个时间之前发生的数据删除丢失,我们是不保证的。因为如果Snapshot hold的时间越长,意味着Snapshot所持有的那些本该清除掉的数据会越来越大。这里大大占据了紧着的集群存储空间。问题发生在突然某一天,我们发现集群的存储空间变得越来越大,并且NN的元数据量的总objects数也一直居高不下。后来发现是因为很多大目录的daily snapshot没有被删除掉。daily snapshot类似如下图所示:
在这里插入图片描述
然后我们迅速检查了与snapshot创建删除相关的脚本,发现其在执行deleteSnapshot删除命令时抛出了NPE的异常,然后导致当天的Snapshot没有被及时删除。然后第二天,后续的daily snapshot又开始进行创建,随后又是没有被删掉。

OK,问题已经发生,当下第一要做的事情是如何删除掉这些多余的snapshot,再删除不掉,集群的存储空间迟早会爆掉的。然后第二步,再来分析其中的root cause。

问题Snapshot的清理


对于这些清理不掉的snapshot,笔者当时尝试用deleteSnapshot再执行了一遍,结果依然是抛出了一个NPE的错误,然后deleteSnapshot依然失败,抛出的异常栈信息如下:

java.lang.NullPointerException
 at org.apache.hadoop.hdfs.server.namenode.INodeFile.storagespaceConsumedNoReplication(INodeFile.java:706)
 at org.apache.hadoop.hdfs.server.namenode.INodeFile.storagespaceConsumed(INodeFile.java:692)
 at org.apache.hadoop.hdfs.server.namenode.snapshot.FileWithSnapshotFeature.updateQuotaAndCollectBlocks(FileWithSnapshotFeature.java:147)
 at org.apache.hadoop.hdfs.server.namenode.snapshot.FileDiff.destroyDiffAndCollectBlocks(FileDiff.java:118)
 at org.apache.hadoop.hdfs.server.namenode.snapshot.FileDiff.destroyDiffAndCollectBlocks(FileDiff.java:38)
 at org.apache.hadoop.hdfs.server.namenode.snapshot.AbstractINodeDiffList.deleteSnapshotDiff(AbstractINodeDiffList.java:94)
 at org.apache.hadoop.hdfs.server.namenode.snapshot.FileWithSnapshotFeature.cleanFile(FileWithSnapshotFeature.java:135
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值