前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hdfs回收站的配置使用与注意事项

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

作者头像
陈猿解码
发布2023-02-28 15:09:52
8220
发布2023-02-28 15:09:52
举报
文章被收录于专栏:陈猿解码

【概述】

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈猿解码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档