当前位置: 首页 > news >正文

HDFD 回收站【Trash】机制

一、回收站 Trash 机制开启

        HDFS本身是一个文件系统,默认情况下HDFS不开启回收站,数据删除后将被永久删除

        添加并修改两个属性值可开启Trash功能 - (core-site.xml)

<property>  <name>fs.trash.interval</name>  <value>1440</value>  
</property>  
注:Trash分钟数,当超过分钟数后检查点会被删除,默认值为0,为0时Trash功能将被禁用<property>  <name>fs.trash.checkpoint.interval</name>  <value>0</value>  
</property>
注:检查点的创建时间间隔(单位为分钟数),其值应该小于或等于 fs.trash.internal。默认为0,为0时,该值设置为 fs.trash.internal的值以上两参数的作用:当NameNode启动后,会启动一个守护线程,每隔【fs.trash.checkpoint.interval】的时间会在【.Trash】目录下创建当前时间的检查点,把最近删除的数据放在此检查点内,并在【fs.trash.interval】的周期去将过期的检查点删除注:检查点 【Trash checkpoint】 : 1.检查点仅仅是用户回收站下的一个目录,用于存储在创建检查点之前删除的所有文件或目录。和 Current 同级目录/user/deploy/.Trash/{timestamp_of_checkpoint_creation}2.删除的文件被移动到回收站Current目录,并且在可配置的时间间隔内,HDFS会为在Current回收站目录下的文件创建检查点/user/${username}/.Trash/<创建日期>,并在过期时删除旧的检查点。

图为:官网参数描述

 图为 .Trash 下的目录

二、回收站 Trash 功能机制使用

        当用户开始回收站后,从HDFS删除的文件或目录不会立即被清除,会被移动到回收站Current目录中:/user/deploy/.Trash/Current,当然还可以使用命令,跳过回收站进行删除,将数据直接永久删除

-- 1.删除 HDFS 数据hadoop fs -rm -r -f /user/hive/external/dwd/dwd_test-- 2.恢复误删除的文件hadoop fs -mv /user/deploy/.Trash/Current/user/hive/external/dwd/dwd_test  /user/hive/external/dwd/dwd_test-- 3.强制删除数据不进入回收站hadoop fs -rm -r -f -skipTrash /user/hive/external/dwd/dwd_test-- 4.手动删除回收站文件hadoop fs -rm -r -f /user/deploy/.Trash/Cureent/user/hive/external/dwd/dwd/dwd_test-- 5,清空 HDFS 的回收站hadoop fs -expunge  (hdfs dfs -expunge 命令只会创建新的checkpoint,不会删除过期的checkpoint)1.Hadoop 官方文档命名的说明-检查点 Checkpoints 的创建与删除expungeUsage: hadoop fs -expunge [-immediate] [-fs <path>]Permanently delete files in checkpoints older than the retention threshold from trash directory, and create new checkpoint. -- 永久删除超过阈值的检查点中文件,并创建新的检查点When checkpoint is created, recently deleted files in trash are moved under the checkpoint. Files in checkpoints older than fs.trash.interval will be permanently deleted on the next invocation of -expunge command.-- 当检查点被创建了,最近删除的数据会被移动到检查点中,在下次执行 expunge 时过期的checkpoint会被永久删除If the file system supports the feature, users can configure to create and delete checkpoints periodically by the parameter stored as fs.trash.checkpoint.interval (in core-site.xml). This value should be smaller or equal to fs.trash.interval.-- 如果文件系统支持该特性,用户可以配置通过存储在fs.trash.checkpoint.interval(在core-site.xml中)中的参数定期创建和删除检查点。这个值应该小于或等于fs.trash.interval。If the -immediate option is passed, all files in the trash for the current user are immediately deleted, ignoring the fs.trash.interval setting.If the -fs option is passed, the supplied filesystem will be expunged, rather than the default filesystem and checkpoint is created.For examplehadoop fs -expunge --immediate -fs s3a://landsat-pds/2.操作如下,执行命令会先进行删除已达到过期时间的 checkpoint ,然后会创建新的checkpoint,将最近删除的数据放入     

图为 手动执行hadoop fs -extunge时先delete检查点,后create检查点的

三、回收站 Trash工作原理-源码

1.1 初始化

        NameNode启动时会在后台启动一个emptier守护线程,用于定时(NameNode重启周期清零)清理HDFS集群上每个用户下的回收站数据,定时周期为 fs.trash.checkpoint.interval。

        源码路径:org.apache.hadoop.hdfs.server.namenode

  private void startTrashEmptier(final Configuration conf) throws IOException {long trashInterval =conf.getLong(FS_TRASH_INTERVAL_KEY, FS_TRASH_INTERVAL_DEFAULT);if (trashInterval == 0) {return;} else if (trashInterval < 0) {throw new IOException("Cannot start trash emptier with negative interval."+ " Set " + FS_TRASH_INTERVAL_KEY + " to a positive value.");}// This may be called from the transitionToActive code path, in which// case the current user is the administrator, not the NN. The trash// emptier needs to run as the NN. See HDFS-3972.FileSystem fs = SecurityUtil.doAsLoginUser(new PrivilegedExceptionAction<FileSystem>() {@Overridepublic FileSystem run() throws IOException {return FileSystem.get(conf);}});this.emptier = new Thread(new Trash(fs, conf).getEmptier(), "Trash Emptier");this.emptier.setDaemon(true);this.emptier.start();}

        调用Trash类初始化配置信息和垃圾回收策略。

        源码路径:org.apache.hadoop.fs.Trash

  public Trash(FileSystem fs, Configuration conf) throws IOException {super(conf);trashPolicy = TrashPolicy.getInstance(conf, fs, fs.getHomeDirectory());}

        HDFS为每个执行用户创建一个专属主目录/user/$USER/,被删除的数据会移动到执行用户的主目录下。

        源码路径:org.apache.hadoop.fs.FileSystem

/** Return the current user's home directory in this filesystem.* The default implementation returns "/user/$USER/".*/public Path getHomeDirectory() {return this.makeQualified(new Path("/user/"+System.getProperty("user.name")));}

        通过反射创建TrashPolicy对象,垃圾回收策略可以用户自定义实现,通过参数fs.trash.classname指定。系统默认使用TrashPolicyDefault.class。

        源码路径:org.apache.hadoop.fs.TrashPolicy

  public static TrashPolicy getInstance(Configuration conf, FileSystem fs, Path home) {Class<? extends TrashPolicy> trashClass = conf.getClass("fs.trash.classname", TrashPolicyDefault.class, TrashPolicy.class);TrashPolicy trash = ReflectionUtils.newInstance(trashClass, conf);trash.initialize(conf, fs, home); // initialize TrashPolicyreturn trash;}

2.2 启动定时线程

        NameNode通过this.emptier.start()方法启动线程,emptier线程周期性休眠后唤醒,执行删除垃圾数据trashPolicy.deleteCheckpoint()和创建检查点trashPolicy.createCheckpoint()操作。

        源码路径:org.apache.hadoop.fs.TrashPolicy

    @Overridepublic void run() {if (emptierInterval == 0)return;                                   // trash disabledlong now = Time.now();long end;while (true) {end = ceiling(now, emptierInterval);try {                                     // sleep for intervalThread.sleep(end - now);} catch (InterruptedException e) {break;                                  // exit on interrupt}try {now = Time.now();if (now >= end) {FileStatus[] homes = null;try {homes = fs.listStatus(homesParent);         // list all home dirs} catch (IOException e) {LOG.warn("Trash can't list homes: "+e+" Sleeping.");continue;}for (FileStatus home : homes) {         // dump each trashif (!home.isDirectory())continue;try {TrashPolicyDefault trash = new TrashPolicyDefault(fs, home.getPath(), conf);trash.deleteCheckpoint();       //删除垃圾数据trash.createCheckpoint();      //创建检查点} catch (IOException e) {LOG.warn("Trash caught: "+e+". Skipping "+home.getPath()+".");} }}} catch (Exception e) {LOG.warn("RuntimeException during Trash.Emptier.run(): ", e); }}try {fs.close();} catch(IOException e) {LOG.warn("Trash cannot close FileSystem: ", e);}}

2.3 删除垃圾数据

        检查/user/${user.name}/.Trash/(所有用户)下的第一级子目录,将目录名为格式yyMMddHHmmss的目录转化为时间 time(跳过Current和无法解析的目录),如果符合条件(now - deletionInterval > time),则删除该目录 (deletionInterval = ${fs.trash.interval})。回收站的默认清理机制粒度比较粗,只针对/user/${user.name}/.Trash/下的第一级子目录.

  public void deleteCheckpoint() throws IOException {FileStatus[] dirs = null;try {dirs = fs.listStatus(trash);            // scan trash sub-directories} catch (FileNotFoundException fnfe) {return;}long now = Time.now();for (int i = 0; i < dirs.length; i++) {Path path = dirs[i].getPath();String dir = path.toUri().getPath();String name = path.getName();if (name.equals(CURRENT.getName()))         // skip currentcontinue;long time;try {time = getTimeFromCheckpoint(name);    //将目录名转换为时间} catch (ParseException e) {LOG.warn("Unexpected item in trash: "+dir+". Ignoring.");continue;}if ((now - deletionInterval) > time) {if (fs.delete(path, true)) {             //删除目录LOG.info("Deleted trash checkpoint: "+dir);} else {LOG.warn("Couldn't delete checkpoint: "+dir+" Ignoring.");}}}}

2.4 创建检查点

        如果/user/${user.name}/.Trash/目录下存在Current目录,则将该目录重命名为yyMMddHHmmss(执行到该条代码的当前时间)。如果不存在Current目录,则直接跳过。重命名后,新的删除数据写入时仍会创建Current目录。

  public void createCheckpoint() throws IOException {if (!fs.exists(current))                     // no trash, no checkpointreturn;Path checkpointBase;synchronized (CHECKPOINT) {checkpointBase = new Path(trash, CHECKPOINT.format(new Date()));}Path checkpoint = checkpointBase;int attempt = 0;while (true) {try {fs.rename(current, checkpoint, Rename.NONE);    //重命名目录break;} catch (FileAlreadyExistsException e) {if (++attempt > 1000) {throw new IOException("Failed to checkpoint trash: "+checkpoint);}checkpoint = checkpointBase.suffix("-" + attempt);}}LOG.info("Created trash checkpoint: "+checkpoint.toUri().getPath());}

四、特殊案例

        集群配置垃圾回收参数如下:

fs.trash.interval = 4320 //3天 fs.trash.checkpoint.interval = 0 //未自定义设置,
fs.trash.checkpoint.interval=${fs.trash.interval}

2018:11:27 08:00:00开始唤醒emptier线程,先执行deleteCheckpoint()方法,理想情况下应该是符合条件((now - deletionInterval) > time)。 
now:大于181127080000,小于181127080010的某个时间点 
deletionInterval:4320 minutes 
time:181124080000 => 符合条件,开始删除181124080000目录

        而在现实操作中,往往会发生如下极端情况:

now:大于181127080000,小于181127080010的某个时间点 
deletionInterval:4320 minutes 
time:181124080033 => 不符合条件,跳过执行createCheckpoint()方法 
fs.trash.checkpoint.interval默认不设置的情况下,会出现本来设置回收站数据保存3天,而实际上会保留接近9天的情况。

五、expunge命令

        用户可以通过手动执行hadoop shell命令清理过期检查点和创建新的检查点,功能同emptier线程的单次执行。

hdfs dfs -expunge 
hadoop fs -expunge

        源码路径:org.apache.hadoop.fs.shell

    protected void processArguments(LinkedList<PathData> args)throws IOException {Trash trash = new Trash(getConf());trash.expunge();trash.checkpoint();    }

        源码路径:org.apache.hadoop.fs.Trash

 /** Delete old checkpoint(s). */public void expunge() throws IOException {trashPolicy.deleteCheckpoint();}

相关文章:

HDFD 回收站【Trash】机制

一、回收站 Trash 机制开启 HDFS本身是一个文件系统&#xff0c;默认情况下HDFS不开启回收站&#xff0c;数据删除后将被永久删除 添加并修改两个属性值可开启Trash功能 - (core-site.xml) <property> <name>fs.trash.interval</name> <value>1440&…...

【Redis】简介

简介 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持多种数据结构&#xff08;如字符串、哈希、列表、集合、有序集合&#xff09;以及多种功能&#xff08;如事务、发布/订阅、Lua脚本执行等&#xff09;。Redis还提供了持久化功能&#xff0c;可以将数据存储到磁…...

【Go进阶】Goroutine 实现原理

目录 1、GMP模型 2、Goroutine调度策略 队列轮转 系统调用 工作量窃取...

TypeScript学习笔记之二(高级类型)

文章目录一、TypeScript高级类型1.1 class类1.2 class继承1.3 class类成员可见性1.4 readonly1.5 类型兼容性1.5.1 对象之间的类型兼容性1.5.2 接口之间类型兼容性1.5.3 函数之间类型兼容性1.6 交叉类型1.7 交叉类型(&)和继承(extends)的对比二、泛型2.1 泛型约束--指定更具…...

如何远程控制电脑?您只需要这样做

案例&#xff1a;在外面怎么远程控制电脑&#xff1f; “我学校教室有电脑&#xff0c;但我每次上课的时候还是需要带自己的电脑&#xff08;好重&#xff01;&#xff09;&#xff0c;只因为有些资料只在自己的电脑上。听说远程控制电脑可以解决这个问题&#xff0c;那如何远…...

【51单片机】:LED任务及汇编解释任务

学习目标&#xff1a; 1、用汇编或者c语言实现D1 D3 D5 D7 为一组 &#xff1b;D2 D4 D6 D8 为一组 &#xff0c;两组实现 1&#xff09;一组亮约一秒 另一组灭一秒&#xff0c;这样的互闪现象五次后 25分 2&#xff09;所有灯灭约一秒后&#xff0c; …...

从生活习惯到肠道微生物,揭秘胃肠道癌症的成因

谷禾健康 编辑​ 癌症一直是全球人类关注的重点&#xff0c;近年来癌症的发病率迅速增加&#xff0c;例如乳腺癌、前列腺癌和肺癌非常普遍。胃肠道癌在发病率和死亡率方面位居首位&#xff0c;并造成重大的社会经济负担。 胃肠道癌症包括胃癌、肝癌、食道癌、胰腺癌和结直肠癌等…...

八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具

本篇文章聊聊如何通过 Docker 和八十行左右的 Python 代码&#xff0c;实现一款类似 Midjourney 官方图片解析功能 Describe 的 Prompt 工具。 让你在玩 Midjourney、Stable Diffusion 这类模型时&#xff0c;不再为生成 Prompt 描述挠头。 写在前面 本文将提供两个版本的工…...

Redis为什么这么快

RedisRedis为什么这么快基于内存单线程实现&#xff08;Redis 6.0 以前&#xff09;IO多路复用模型高效的数据结构Redis为何选择单线程Redis的应用场景Redis怎么实现消息队列Redis的主从复制原理主从复制的原理过期键的删除策略Redis为什么这么快 基于内存 Redis是使用内存存…...

JayDeBeApi对数据类型的支持

JayDeBeApi对数据类型的支持 常用的数据类型如下&#xff1a; 字符类型 内置字符类型包括&#xff1a;char, nchar, varchar, nvarchar 和lvarchar CHARACTER(n) 和 CHARACTER VARYING(n)这样的别名同样支持 参考代码&#xff1a;test_string_type.py create ""&…...

一文盘点 Zebec 生态几大利好,让 ZBC 近期“狂飙”

近期&#xff0c;ZBC通证迎来了新一轮上涨趋势&#xff0c;我们看到其从3月11日左右的低点$0.0115上涨至$0.0175&#xff0c;这也是近期的最大涨幅之一。我们看到&#xff0c;推动ZBC上涨的主要因素&#xff0c;是Zebec生态近期频繁的布局所带来的系列利好推动。 本文将对近期的…...

【数据结构】栈和队列(笔记总结)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…...

【Java】自定义注解和AOP切面的使用

前言 我们在开发的过程中&#xff0c;一般都需要对方法的入参进行打印&#xff0c;或者Debug调试的时候我们要查看方法入参的参数是否数量和数据正确性。 一般我们需要知道请求的参数、接口路径、请求ip等 但是考虑以后项目上线BUG排查的问题&#xff0c;最好的方式就是使用…...

前后台协议联调拦截器

前后台协议联调&拦截器4&#xff0c;前后台协议联调4.1 环境准备4.2 列表功能4.3 添加功能4.4 添加功能状态处理4.5 修改功能4.6 删除功能5&#xff0c;拦截器5.1 拦截器概念5.2 拦截器入门案例5.2.1 环境准备5.2.2 拦截器开发步骤1:创建拦截器类步骤2:配置拦截器类步骤3:S…...

【还在传统绑骨骼动画?】让AI助力你实现2D游戏角色动画流程

思路&#xff08;让3D模型替代动作&#xff09; 一、利用MJ或者SD生成你需要的游戏角色&#xff08;获取原图像&#xff09; 需要的知识&#xff1a; 会调关键词chatGpt&#xff08;看小红书、抖音、B站、Youtube、Telegrame等等都行&#xff0c;别傻忽忽跑到知识星球被收割…...

动态规划+例题

适用场景 题目链接&#xff1a;数字三角形 /*正推DP&#xff0c;可能数据比较小&#xff0c;这个正推不太麻烦可以AC*/ #include<bits/stdc.h> using namespace std; int r; int a[1005][1005],f[1005][1005];int main(){cin>>r;for(int i1;i<r;i){for(int j1…...

快商通荣获多个政府科技、人才奖项

近日&#xff0c;快商通与快商通首席科学家李海洲教授荣获由厦门市科学技术局、厦门市委人才办等多部门发布的“2022年度厦门市科学技术奖”、“2022厦门十大成长性人才企业”、“2022厦门战略性新兴产业十大创新人才”等多个 政府科技、人才奖项 &#xff0c;并进行全网公示。…...

Linux的基本命令的使用

文章目录一、初识LinuxLinux目录结构二、如何拥有一个Linux环境&#xff1f;三、Linux命名Linux命令基础lscd pwd特殊路径符clearmkdirtouch cat morecp mv rmsuwhich findgrep wc 管道符ehco tail 重定向符psnetstatvi vim一、初识Linux 我们的计算机由硬件和软件两部分组成&…...

RecycleView小结

RecycleView四级缓存 一级缓存&#xff1a;用于存放当前屏幕可显示区域的ViewHolder&#xff0c;目的是为了方便更新数据&#xff0c;以及对View操作时更加快捷二级缓存&#xff1a;用于缓存最近滑动出屏幕的ViewHolder&#xff0c;目的是为了当用户将该View滑出屏幕外时又突然…...

【Python】如何实现Redis构造简易客户端(教程在这)

文章目录前言一、准备二、原理剖析三、编写简易Redis客户端总结前言 Redis 是我们在开发过程中经常会用到的内存数据库&#xff0c;尤其是在Python的第三方模块Redis-py的支持下&#xff0c;在Python中使用Redis及其方便。 但是在有些情况下&#xff0c;我们无法使用像Redis-…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...