HDFS拥有回收站的功能,将某一段时间的删除的数据,放到指定路径(/user/{username}/.Trash),至少保留指定的时间,然后一起删除。
现实中发现回收站里有该删除的却没有删除,和回收站原理逻辑对不上。
以下从源码上看看到底是什么原因导致的。
背景
某HDFS集群指定数据保留时间为360分钟,理论是删除的数据至少保留6小时,才会被真正的删除。当前时间删除的数据放入(/user/{username}/.Trash/Current/)目录,以6小时为周期,每个周期的起点时间,将.Trash/Current/目录(也就是上个周期的被删除的数据)重命名为当前时间格式为yyMMddHHmmss 的名字的目录,例如 /user/hive/.Trash/240819080022。
回收站正常的执行流程(每个时间点的该执行的动作):
1. 08:00 将目录名为: yyMMdd020000 的彻底删除(也就是目录名为凌晨02点)
将.Trash/Current/目录 重命名为:.Trash/yyMMdd080000
2. 14:00 将目录名为: yyMMdd080000 的彻底删除(也就是目录名为凌晨08点)
将.Trash/Current/目录 重命名为:.Trash/yyMMdd140000
3. 20:00 将目录名为: yyMMdd140000 的彻底删除(也就是目录名为凌晨14点)
将.Trash/Current/目录 重命名为:.Trash/yyMMdd200000
4. 02:00 将目录名为: yyMMdd200000 的彻底删除(也就是目录名为凌晨20点)
将.Trash/Current/目录 重命名为:.Trash/yyMMdd020000
5. 重复执行到第1步,继续循序
发现的问题
按理来说每天的 2点8点14点20点 都应该会出现明显的容量下降现象。但是现实中从hdfs容量监控发现,唯独每天14点却没有明显的容量下降?这个不是个别现象,每天如此。
这种原因究竟是什么导致的?
根据以上流程 14点 应该删除的是目录名为 yyMMdd080000 。可以到命令行中查看.Trash/目录的情况,发现 XXXXXX080000 仍在,没有被删除。
也可以说:正常情况是 .Trash 路径下,只有一个current目录和一个带日期的目录。这里明显多了一个带日期的目录。
$ hadoop fs -ls /user/XXXXXX/.Trash
Found 3 items
d