HDFS 垃圾回收站设计目标
HDFS 垃圾回收站设计目标是为了防止用户意外删除文件、目录.
HDFS 删除文件的方式
- 通过命令行的方式删除 HDFS 文件
hadoop fs -rm /xxx/xxx : 默认行为, 先进入垃圾回收站
hadoop fs -rm -skipTrash /xxx/xxx : 跳过回收站立即删除
-
用户应用程序调用 RPC 接口立即删除文件
HDFS 垃圾回收站原理
以执行 hadoop fs -rm /tmp/README.txt 为案例分析:
- 执行命令后判断用户目录下是否存 .Trash/Current 文件夹,不存在则会创建
/user/wzh/.Trash/Current/
- 然后再将用户删除文件(文件夹)remove 到 .Trash/Current 文件夹下
/user/wzh/.Trash/Current/tmp/README.txt
- HDFS 使用默认的垃圾回收策略 TrashPolicyDefault ,在 NameNode 中会启动一个 Emptier 线程每间隔一定时间处理回收站中的文件
# Emptier 线程运行间隔时间配置 (分钟)
fs.trash.checkpoint.interval
- Emptier 首先会找到 /user/ 目录,遍历下面所有用户目录执行 deleteCheckpoint、createCheckpoint 两个逻辑
- createCheckpoint 逻辑会将 Current 目录 rename 为以当前时间(yyMMddHHmmss) 为准的目录(即 Checkpoint目录 )
/user/wzh/.Trash/Current
. |
. | rename to
. |
/user/wzh/.Trash/220131164211
- deleteCheckpoint 逻辑会删除 Trash 目录下所有到期的"Checkpoint目录",计算逻辑以 "Checkpoint目录" 名称为起始时间计算判断是否过期
# HDFS 文件在垃圾回收站存活的时间 (分钟)
fs.trash.interval
HDFS 垃圾回收站参数
配置 | 用途 |
---|---|
fs.trash.checkpoint.interval | Emptier 运行间隔时间 |
fs.trash.interval | 回收站文件存活时间,如果为 0 则认为不启用回收站 |
HDFS 垃圾回收站存在的问题
删除大目录问题
- 当在 Emptier 一个运行间隔时间内用户删除大量的文件或目录,导致该 Checkpoint 目录下文件数目过多
- 在执行 delete Checkpoint 时删除“大目录” 会长期占用 NameNode 全局写锁(FSNamesystemLock) 直接会影响 NameNode 服务稳定性
回收站文件存活时间不精准
- 垃圾回收站生命周期粒度较粗,以 Checkpoint 时间为准不能精确到删除时间
- 文件实际保留时间 fs.trash.interval + fs.trash.checkpoint.interval
其它命令
hadoop fs -expunge : 针对当前用户执行一次 deleteCheckpoint、createCheckpoint 逻辑