Hadoop Trash
几个重要问题
问题1:一个文件被删除(hadoop fs -rm)到永久删除,需要过多久
开启trash功能后,一个文件被删除,首先会放到.Trash/Current中,到了下一个checkpoint时间点,
则进行checkpoint,也就是把Current目录重命名一下,这个checkpoint目录经过一定的时间就会被删除,
这时,文件就被永久删除了。
从一个文件被删(即移到.Trash/Current)到下一个checkpoint的时间,介于0~fs.trash.checkpoint.interval之间,
checkcpoint删除的时间则是固定的,为fs.trash.interval。
所以一个文件保留的时间介于:fs.trash.interval ~ fs.trash.interval+fs.trash.checkpoint.interval之间。
所以fs.trash.interval为7天时,被删除的文件保留的时间是7天~14天,既不是准确的7天也不是14天。
同样,如果fs.trash.interval为6天,fs.trash.checkpoint.interval为2天,则文件的保留时间是6天~8天。
一个文件的保留时间是一个区间,根本原因在于永久删除文件是以checkpoint为单位的(也就是凑成一批一批的),
而不是以单个文件为单位的。官网对fs.trash.interval这个属性的解释:Number of minutes after which the checkpoint gets deleted.
具体可以看下面这个图:
问题2:Current文件夹和checkpoint文件夹(151119080018)时间不一致,怎么解释
[image02 here]
分两个方面。
一方面,关于Current文件夹的时间。
151119080018这个时间点做了checkpoint之后,Current文件夹就空了,
之后又有新的文件file1被删除(即移到.Trash/Current),
这时Current目录的时间会变为最后一次删除文件file1的时间。做了一个实验,证实了这个解释。
总之,.Trash/Current文件夹的时间是不断变化的。
Trash原来状态:
drwx------ - hdfs hdfs 0 2015-11-21 00:11 /user/hdfs/.Trash
drwx------ - hdfs hdfs 0 2015-11-23 12:26 /user/hdfs/.Trash/Current
删除一个文件:
hadoop fs -put trash-test.txt
-rw-r--r-- 3 hdfs hdfs 15 2015-11-24 13:41 /user/hdfs/trash-test.txt
hadoop fs -rm /user/hdfs/trash-test.txt
删除文件后Trash状态:
drwx------ - hdfs hdfs 0 2015-11-21 00:11 /user/hdfs/.Trash
drwx------ - hdfs hdfs 0 2015-11-24 13:44 /user/hdfs/.Trash/Current
另一方面,关于checkpoint文件夹的时间。
checkpoint文件夹(151119080018)自身的时间是2015-11-17 19:30,这个时间和checkpoint时间点也不一致。
这个可以这么解释,Checkpoint之前最后一次删除文件是2015-11-17 19:30。因为checkpoint是rename,所以不会改变目录的时间。
做了如下实验,证实了这个解释。
目录原先状态:
drwxr-xr-x - hdfs hdfs 0 2015-11-24 13:54 trash-test-dir
目录rename:
hadoop fs -mv trash-test-dir trash-test-dir-renamed
目录rename后的状态
drwxr-xr-x - hdfs hdfs 0 2015-11-24 13:54 trash-test-dir-renamed
可以看到rename后文件的时间不改变。
建议:
<property>
<name>fs.trash.checkpoint.interval</name>
<value>2880</value>
<description> Number of minutes between trash checkpoints.Every time the checkpointer runs it creates a new checkpoint out of current and removes checkpoints created more than fs.trash.interval minutes ago. </description>
</property>