hdfs回收站的配置使用与注意事项

2023-02-28 15:09:52 浏览数 (1)

【概述】

在hdfs使用过程中,通过"rm"命令可以进行文件的删除,然后有时候,难免会出现误删了某个文件。那么hdfs是否存在回收站的功能,文件删除而不是真的删除,而是先进入垃圾回收站,这样可以对误删的文件有机会进行还原。本文就来聊聊hdfs中的回收站功能原理

【配置使用】

hdfs的回收站功能默认是不开启的,如需使用,只需在namenode的配置文件`core-site.xml`中增加如下配置项即可:

代码语言:javascript复制
<!-- 进入回收站的文件的存放时间, 单位为min-->
<!-- 默认为0, 即不启用回收站 -->
<property>
    <name>fs.trash.interval</name>
    <value>10</value>
</property>
<!-- 回收站中文件超时的检测时间间隔, 单位为min -->
<property>
    <name>fs.trash.checkpoint.interval</name>
    <value>3</value>
</property>

完成配置后,我们就可以来进行测试,通过"hdfs dfs -rm"命令对某个文件进行删除时,文件进入了回收站。

回收站的位置默认为: "/user/$User/.Trash/Current"

一个简单的示例:

代码语言:javascript复制
[root@nn-1 hadoop]# hdfs dfs -rm /hncscwc/core-site.xml
22/10/14 14:13:46 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hdfsHACluster/hncscwc/core-site.xml' to trash at: hdfs://hdfsHACluster/user/root/.Trash/Current/hncscwc/core-site.xml

[root@nn-1 hadoop]# hdfs dfs -ls /user/root/.Trash/Current
Found 1 items
drwx------ - root supergroup 0 2022-10-14 14:13 /user/root/.Trash/Current/hncscwc
[root@nn-1 hadoop]# hdfs dfs -ls /user/root/.Trash/Current/hncscwc
Found 1 items
-rw-r--r-- 3 root supergroup 1997 2022-10-14 14:13 /user/root/.Trash/Current/hncscwc/core-site.xml

经过10分钟后,回收站中的文件也被删除了

如果想要从回收站还原删除的文件,只需要通过`hdfs dfs -mv`命令,将文件移动到其他目录即可。

代码语言:javascript复制
[root@nn-1 hadoop]# hdfs dfs -mv /user/root/.Trash/221014160300/hncscwc/core-site.xml /hncscwc/
[root@nn-1 hadoop]# hdfs dfs -ls -R /user/root/.Trash /hncscwc
drwx------ - root supergroup 0 2022-10-14 16:01 /user/root/.Trash/221014160300
drwx------ - root supergroup 0 2022-10-14 16:03 /user/root/.Trash/221014160300/hncscwc
-rw-r--r-- 3 root supergroup 1997 2022-10-14 16:00 /hncscwc/core-site.xml

当然,通过命令删除文件时,也可以直接跳过回收站直接进行删除,例如:

代码语言:javascript复制
[root@nn-1 hadoop]# hdfs dfs -ls /hncscwc /user/root
Found 1 items
-rw-r--r-- 3 root supergroup 1997 2022-10-14 15:59 /hncscwc/core-site.xml
Found 1 items
drwx------ - root supergroup 0 2022-10-14 15:15 /user/root/.Trash
[root@nn-1 hadoop]# hdfs dfs -rm -skipTrash /hncscwc/core-site.xml
Deleted /hncscwc/core-site.xml
[root@nn-1 hadoop]# hdfs dfs -ls /hncscwc /user/root
Found 1 items
drwx------ - root supergroup 0 2022-10-14 15:15 /user/root/.Trash

【原理】

通过命令的方式,删除的文件可以正确进入回收站中,那么程序中删除的文件是否也同样可行呢?

答案是不会的!!通过API调用进行删除的文件直接就被删除了。除此之外,通过NN界面删除的文件也不会进入回收站,而是直接被删除了。

三者之间的关系如下图所示:

结合上面的图来梳理下在启用回收站后,"hdfs dfs -rm xx"命令执行到文件最终被删除的流程:

  • 执行"hdfs dfs -rm xxx"命令时,首先检查"/user/${USER}/.Trash/Current"目录是否存在,不存在则创建。然后将待删除的文件移动(mv)到该目录下。
  • NN内部在启动时,创建独立线程(Emptier)定时对"/user/{User}/.Trash/TIMESTAMP","TIMESTAMP"为系统当前时间"yyMMddHHmmss"格式;而"deleteCheckpoint"则是检测"/user/TIMESTAMP"是否过期,如果过期则进行删除。是否过期的依据为:当前时间-

例如:

代码语言:javascript复制
# 1. 删除/hncscwc/core-site.xml 文件 移动到回收站
[root@nn-1 hadoop]# date;hdfs dfs -ls -R /user/root/.Trash
Fri Oct 14 14:59:44 CST 2022
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/Current
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/Current/hncscwc
-rw-r--r-- 3 root supergroup 1997 2022-10-14 14:57 /user/root/.Trash/Current/hncscwc/core-site.xml

# 2. 定时检测,将Current重命名
[root@nn-1 hadoop]# date;hdfs dfs -ls -R /user/root/.Trash
Fri Oct 14 15:00:03 CST 2022

drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc
-rw-r--r-- 3 root supergroup 1997 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc/core-site.xml

# 3. 删除/hncscwc/hdfs-site.xml 移动到回收站
[root@nn-1 hadoop]# date;hdfs dfs -ls -R /user/root/.Trash
Fri Oct 14 15:01:11 CST 2022
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc
-rw-r--r-- 3 root supergroup 1997 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc/core-site.xml
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/Current
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/Current/hncscwc
-rw-r--r-- 3 root supergroup 4094 2022-10-14 15:00 /user/root/.Trash/Current/hncscwc/hdfs-site.xml

# 4. 再次定时检测,将Current重命名
[root@nn-1 hadoop]# date;hdfs dfs -ls -R /user/root/.Trash
Fri Oct 14 15:03:01 CST 2022
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000
drwx------ - root supergroup 0 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc
-rw-r--r-- 3 root supergroup 1997 2022-10-14 14:57 /user/root/.Trash/221014150000/hncscwc/core-site.xml
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/221014150300
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/221014150300/hncscwc
-rw-r--r-- 3 root supergroup 4094 2022-10-14 15:00 /user/root/.Trash/221014150300/hncscwc/hdfs-site.xml

# 5. 超时删除
[root@nn-1 hadoop]# hdfs dfs -ls -R /user/root/.Trash
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/221014150300
drwx------ - root supergroup 0 2022-10-14 15:01 /user/root/.Trash/221014150300/hncscwc
-rw-r--r-- 3 root supergroup 4094 2022-10-14 15:00 /user/root/.Trash/221014150300/hncscwc/hdfs-site.xml

对于指定了"-skipTrash"、通过API,又或者是通过NN界面删除文件,这三种方式都是直接向NN发起rpc删除文件的请求,这样就不会经过回收站了。

【使用注意事项】

1. 配额问题

从上面的介绍可以知道,通过命令删除文件时,仅仅是将文件移动到了用户home目录下。那么如果待删除的文件累加超过了用户home的配置,那么删除命令会执行失败。

代码语言:javascript复制
[root@nn-1 hadoop]# hdfs dfs -rm -f /hncscwc/test4.log
rm: Failed to move to trash:
hdfs://hdfsHACluster/hncscwc/test4.log: The DiskSpace quota of/user/root is exceeded: quota = 1073741824 B = 1 GB but diskspaceconsumed = 1258300215 B = 1.17 GB

2. 删除用户home目录

由于用户home目录中包含了回收站的内容,直接删除用户home目录是失败的, 因为无法移动到回收站中。但是,可以通过"-skipTrash"来删除。

代码语言:javascript复制
[root@nn-1 hadoop]# hdfs dfs -rm -r /user/root
rm: Cannot move "hdfs://hdfsHACluster/user/root" to the trash, as itcontains the trash. Consider using -skipTrash option

3. API删除接口支持回收站问题

当前,通过API接口删除文件无法进入到回收站,而社区(HDFS-16032)中也就此进行过讨论,最终被驳回没有支持。

一是DistributedFileSystem只是hadoop支持的其中一个文件系统,如果delete方法支持回收站,需要所有文件系统都支持,但是s3a和abfs文件系统会存在问题。

二是设置回收站的目的是恢复误删的文件,通过程序调用接口删除文件应该全在意料之中,不会出现误删的情况,且如果确实有必要使用回收站,可以通过编码的形式达到目的(例如将delete改为mv移动到回收站中)。

三是兼容性的考虑,只要"fs.trash.interval"大于0,就开启回收功能,但如果要保持和之前delete一致的效果,就需要额外传入一个skipTrash参数。

0 人点赞