HDFS的Trash功能

Posted Java不睡觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的Trash功能相关的知识,希望对你有一定的参考价值。

hdfs的trash有点类似于linux和windows中的垃圾箱,用户删除数据后并不会直接删掉,而是先放入垃圾箱中,如果用户误删除了数据,trash就给用户一个可以反悔的机会。

hdfs默认是不开启trash功能的,如果要开启trash功能,需要在core-site.xml中配置以下两个相关参数:

fs.trash.interval (默认值是0)
fs.trash.checkpoint.interval (默认值是0)        

fs.trash.interval 配置项的意义如下:

多少分钟后删除checkpoint文件。如果是0,那么trash功能被禁用。

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.

fs.trash.checkpoint.interval配置项的意义如下:

两次trash checkpoint之间的分钟间隔,这个值应该被设置为小于等于 fs.trash.interval的值。如果配置项为0,那么这个配置项的值会被设置为fs.trash.interval的值。checkpointer线程每次运行的时候,都会对trash目录中的current目录进行创建一个checkpoint(其实是重命名操作),并把在fs.trash.interval 分钟之前创建的checkpoint删除掉。

Number of minutes between trash checkpoints. Should be smaller or equal to fs.trash.interval. If zero, the value is set to the value of fs.trash.interval. Every time the checkpointer runs it creates a new checkpoint out of current and removes checkpoints created more than fs.trash.interval minutes ago.

我们的生产环境配置的是24h一删。对应的配置如下:

<property>
<name>fs.trash.interval</name>
<value>1440</value>
<final>false</final>
<source>core-site.xml</source>
</property>


<property>
<name>fs.trash.checkpoint.interval</name>
<value>0</value>
<final>false</final>
<source>core-default.xml</source>
</property>

线上的用户trash目录内容如下图所示,总共有两种类型的目录,一种是current目录,一种是数字结尾的目录(checkpoint)。数字结尾的目录其实是checkpoint的时间,比如第一个201109110929。这个表示20年11月09日11点09分29秒。这个格式是在源码中定义的格式:private static final DateFormat CHECKPOINT = new SimpleDateFormat("yyMMddHHmmss");

接下来对trash的相关源码进行一个简单分析:

trash功能只有active namenode才可以进行。所以在namenode的startActiveServices方法中,开启了trash emptier功能。

HDFS的Trash功能

startTrashEmptier方法里做了一些参数检查,然后开启清理线程(empiter)

HDFS的Trash功能

接下来我们就去看看emptier的实际Runnable对象:new Trash(x,x).getEmptier()。

经过层层跳转,我们来到了TrashPolicyDefault类的getEmptier方法中,这个方法返回了一个默认的Empiter。

HDFS的Trash功能

主要看Emptier类的run方法,这是trash真正工作的逻辑。主要就是根据设置的清理时间间隔去删除所有用户的trashRoot下的checkpoint目录,然后再创建checkpoint目录。接下来我们进入到createCheckpoint方法中:

createCheckpoint方法的逻辑也是很简单,就是先生成checkpoint目录的path字符串,然后把current目录重命名成生成的path字符串。

以上内容就是HDFS Trash的大致原理。


以上是关于HDFS的Trash功能的主要内容,如果未能解决你的问题,请参考以下文章

hadoop上删除文件

HDFS恢复误删操作的方法

乐视手机大文件开头为trash_-1761533705-anmc的可以删除吗?

hdfs清空回收站

CM记录-HDFS清理垃圾回收站

恢复HDFS文件删除后的方法