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

【概述】

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

【配置使用】

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

<!-- 进入回收站的文件的存放时间, 单位为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"

一个简单的示例:

[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`命令,将文件移动到其他目录即可。

[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

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

[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界面删除的文件也不会进入回收站,而是直接被删除了。

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

0ef149cf792749d87de62a493e448212.jpeg

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

  • 执行"hdfs dfs -rm xxx"命令时,首先检查"/user/${USER}/.Trash/Current"目录是否存在,不存在则创建。然后将待删除的文件移动(mv)到该目录下。

  • NN内部在启动时,创建独立线程(Emptier)定时对"/user/${USER}/.Trash"目录下的文件夹进行检测,并执行"deleteCheckpoint"和"createCheckpoint"动作。

    其中"createCheckpoint"是将"/user/${User}/.Trash/Current"目录重命名为"/user/${User}/.Trash/$TIMESTAMP","$TIMESTAMP"为系统当前时间"yyMMddHHmmss"格式;

    而"deleteCheckpoint"则是检测"/user/${User}/.Trash/$TIMESTAMP"是否过期,如果过期则进行删除。是否过期的依据为:当前时间-$TIMESTAMP > fs.trash.interval

例如:

# 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的配置,那么删除命令会执行失败。

[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"来删除。

[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参数。

好了,这就是本文的全部内容,如果觉得本文对您有帮助,请点赞+转发,也欢迎加我微信交流~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值