【简介】

HDFS快照简单地说就是对某个文件夹进行备份,创建了快照的文件夹本身不能被删除,但是文件夹里面的文件和文件夹都是可以被删除的。在对一个文件夹创建快照之前,需先允许该文件夹可以创建快照
允许快照
hdfs dfsadmin -allowSnapshot <path>

创建快照
hdfs dfs -createSnapshot <path> [<snapshotName>]
其中snapshotName是快照名,可选参数,不填的话会自动生成一个快照名,命名规则类似:s20180118-174044.492,创建快照后,会在文件夹下看到.snapshot目录,该目录存放所有的快照

查看所有的snapshottable
hdfs lsSnapshottableDir

恢复快照
hdfs dfs -cp <snapshotpath> <path>

删除快照
hdfs dfs -deleteSnapshot <path> <snapshotName>

取消快照
hdfs dfsadmin -disallowSnapshot <path>
取消快照之前,需先删掉所有的快照

快照对比
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>

HDFS中可以对目录创建Snapshot,创建之后不管后续目录发生什么变化,都可以通过snapshot找回原来的文件和目录结构。
为了启用这种功能,首先需要启用目标目录的snapshot功能,可以通过下面的命令来执行:
hdfs dfsadmin -allowSnapshot <path> 启用snapshot功能后,并不会自动进行snapshot保存,还需要先创建snapshot, 通过下面的命令来执行:
hdfs dfs -createSnapshot <path> [<snapshotName>]
可以为相同的目录创建多个snapshot, 不同的snapshot通过名字来区分,默认是syyyyMMdd-HHmmss.SSS,例如/storage/WALs/.snapshot/s20140515-084657.639
【实现原理】
实现上是通过在每个目标节点下面创建snapshot节点,后续任何子节点的变化都会同步记录到snapshot上。例如删除子节点下面的文件,并不是直接文件元信息以及数据删除,而是将他们移动到snapshot下面。这样后续还能够恢复回来。另外snapshot保存是一个完全的现场,不仅是删除的文件还能找到,新创建的文件也无法看到。后一种效果的实现是通过在snapshot中记录哪些文件是新创建的,查看列表的时候将这些文件排除在外。
在HDFS中INode表示一个节点,其中INodeFile表示文件,INodeDirectory表示目录。INodeFileWithSnapshot表示带有快照的文件,INodeDirectoryWithSnapshot表示带有快照的目录, (INodeDirectorySnapshottable表示可以创建快照的目录,INodeDirectoryWithSnapshot不能创建新的快照,只能将目录的变化记录到现有的快照里面)相关的类结构如下:
 
图中红线表示的是关键类的引用关系,其中最重要的是DirectoryDiffList,里面保存了一些快照和当前目录的差别。每一个DirectoryDiff中包含快照以及儿子变化,是实现快照功能的核心。ChilderenDiff中created list保存的是从快照时间之后新创建的节点,deteled list保存的新删除的节点。snapshot中的root节点保存了snapshot的name,可以通过这个找到对应的快照。
【例子分析】
我们通过一个例子来分析整个snapshot的实现细节:
1. 文件目录树如下图所示,并且我们已经通过命令启动了a的snapshot功能,结构如下图所示:

图中.snapshot是虚拟节点,保存了所有的snapshot列表,其中diff中还保存当前节点下面的变化,一个snapshot对应于一个diff.要注意的是snapshot中可以被多个目录的diff引用,后续会进行说明。
2. 当我们执行createSnapshot命令时,结果如下:

3. 当删除文件e的时候

不论是删除一个文件还是一个目录,只要是直接子节点,都会将节点转换为快照版本.例如e会变成INodeFileWithSnapshot,在a的DirectoryDiff中ChildDiff中deleted列表中将会包含e,而在a的正常节点下会被删除。目录节点的处理同样。

4. 删除孙子节点是的情况

处理这种节点的原则是:先将孙子节点转变为Snapshot版本,然后将父节点变为snapshot版本,同时将孙子节点版本加入到直接父节点的diff列表中。为了能够通过同一个snapshot找到当时的文件,需要将新的diff指向到老的snapshot版本上。图中d节点是INodeDirectoryWithSnapshot(不是INodeDiretorySnapshottable, 本身不允许在d上创建snapshot)

一、snapshot的定义: 
snapshot是hdfs的整个文件系统,或者某个目录在某个时刻的镜像。该镜像并不会随着源目录的改变而进行动态的更新。 
二、使用snapshot可以解决的问题 
(1)防止用户的误操作 
管理员可以通过滚动的方式来对重要的目录进行创建snapshot的操作,这样在系统中就存在针对某个目录的多个快照版本。当用户误删除掉某个文件时,可以通过最新的snapshot来进行相关的恢复操作。 
(2)备份集群或者重要目录 
管理员可以使用snapshot来进行整个集群,或者某些目录、文件的备份。管理员以某个时刻的snapshot做为备份的起始结点,然后通过比较不同备份之间差异性,来进行增量备份。 
(3)在原始数据上进行测试或者实验 
经常有业务部门需要在某些重要数据上不断的进行某些测试或者实验,某些程序的bug可能会直接将原始的数据破坏掉,所以为了防止这种情况的发生,管理员可以临时的为用户针对要操作的数据来创建一个snapshot,然后让用户在对应的snapshot上进行相关的实验和测试,从而避免对原始数据的破坏。 
(4)灾难的备份 
可以将集群某个时刻的snapshot拷贝到远程的备份集群,从而实现远程的灾难备份。

三、与snapshot相关的主要操作: 
1、为某个目录打开snapshot的功能 
sudo -u hdfs hdfs dfsadmin -allowSnapshot /tmp/important_dir 
2、查看已经开启了snapshot的目录列表 
sudo -u hdfs hdfs lsSnapshottableDir 
3、为开启了snapshot功能的目录创建一个snapshot 
sudo -u hdfs hdfs dfs -createSnapshot /tmp/important_dir important_dir_snapshot 
4、对开启了snapshot功能的目录执行删除操作,会出现下面的错误提示,即不允许删除已经开启了snapshot功能的目录 
sudo -u hdfs hdfs dfs -rmr /tmp/important_dir 
错误提示: 
rmr: Failed to move to trash: hdfs://ptmind-cluster/tmp/important_dir: The directory /tmp/important_dir cannot be deleted since /tmp/important_dir is snapshottable and already has snapshots 
5、删除开启了snapshot功能的目录下的文件 
sudo -u hdfs hdfs dfs -rm /tmp/important_dir/important_file.txt 
文件被成功的删除掉,那如果是误删除了此文件呢?该如何进行恢复呢?

6、恢复已经被误删除的文件 
查看.snapshot子目录下,是否包含已经被删除的文件?发现包含被误删除的文件。 
sudo -u hdfs hdfs dfs -ls /tmp/important_dir/.snapshot/important_dir_snapshot 
将误删除的文件从.snapshot子目录拷贝到之前的目录下 
sudo -u hdfs hdfs dfs -cp /tmp/important_dir/.snapshot/important_dir_snapshot/important_file.txt /tmp/important_dir 
至此,被误删除的文件被成功的恢复了

7、比较两个snapshot之间的差异性 
重新创建一个snapshot 
sudo -u hdfs hdfs dfs -createSnapshot /tmp/important_dir important_dir_snapshot_2 
hdfs snapshotDiff /tmp/important_dir important_dir_snapshot important_dir_snapshot_2 
可以使用 “.”来代表目录的当前最新状态

结果的解释: 
+ The file/directory has been created. 
- The file/directory has been deleted. 
M The file/directory has been modified. 
R The file/directory has been renamed.

其他相关操作: 
1、对snapshot进行重命名 
hdfs dfs -renameSnapshot 
2、删除snapshot 
hdfs dfs -deleteSnapshot 
3、禁止某个目录的snapshot特性 
hdfs dfsadmin -disallowSnapshot

注意: 
snapshot只是保存了某个目录在某个时刻的快照,如果在执行完createSnapshot 的操作之后,又往之前的目录下新添加了文件,那么此时在.snapshot目录下并不会存在新添加的文件。

对于snapshot内部是如何工作的,会单独的再写一篇文章来进行说明。

HDFS SnapShot原理相关推荐

  1. HDFS底层原理系列讲解之fsimage、editslog

    HDFS底层原理系列讲解之fsimage.editslog

  2. 一图看懂hadoop分布式文件存储系统HDFS工作原理

    一图看懂hadoop分布式文件存储系统HDFS工作原理 转载于:https://www.cnblogs.com/AlexQY/p/9856477.html

  3. hdfs snapshot 快照的使用场景应用与操作命令的介绍

    hdfs snapshot 快照的应用与操作命令的介绍 一:HDFSSnapShot的介绍 Hadoop从2.1.0版开始提供了HDFS SnapShot的功能. 一个snapshot(快照)是一个全 ...

  4. Hadoop生态圈(十六)- HDFS Snapshot快照详解

    目录 前言 1. Snapshot快照 1.1 快照介绍和作用 1.1.1 数据恢复 1.1.2 数据备份 1.1.3 数据测试 1.2 HDFS快照的实现 1.3 快照的命令 1.3.1 快照功能启 ...

  5. Linux 快照 (snapshot) 原理与实践(二) 快照功能实践

    文章目录 0. 概要 1. 准备演示数据 2. 创建 snapshot-origin 目标 3. 创建 snapshot 目标 4. 验证 COW 操作 4.1 第一次写数据 4.2 第二次写数据 5 ...

  6. Linux 快照 (snapshot) 原理与实践(一) 快照基本原理

    文章目录 0. 背景 1. 如何理解快照(snapshot)? 2. 快照 (snapshot) 的原理 2.1 全量快照 1. 克隆 (Clone) 2. 镜像分离 (Split Mirror) 2 ...

  7. Hadoop三大组件之分布式文件操作系统HDFS实现原理及编程

    文章目录 HDFS---分布式文件系统 分布式文件系统简介 HDFS相关概念 HDFS体系结构 HDFS命名空间 HDFS存储原理 HDFS数据读写过程 读的过程-JAVA代码 写入文件-JAVA代码 ...

  8. Stream Processing:Apache Flink快照(snapshot)原理

    本文将要讲解的是Apache Flink分布式流处理的轻量异步的快照原理.网上已经有几篇相关的博文,而本文的不同之处在于,它不是论文的纯粹翻译(论文地址),而是用自己的语言结合自己的理解对其原理的阐述 ...

  9. Hadoop1.x中HDFS工作原理

    HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Googl ...

最新文章

  1. Date类(java.util)和SimpleDateFormat类(java.text)
  2. 像数据分析一样写 Web 页面,这个 Python 库做到了!
  3. CUDA driver version is insufficient for CUDA runtime version
  4. C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在
  5. 利用jquery给指定的table动态添加一行、删除一行
  6. python 读取txt文件为字典_python将txt文件读取为字典的示例
  7. [紧急问题和解决方案] 无法打开被权限管理服务(RMS)加密的Office 2003文档
  8. 96. Unique Binary Search Trees1和2
  9. Team Foundation Server (TFS) 2015 安装指导
  10. 【Python-2.7】大小写转换函数
  11. 这个录屏神器好用哭了!
  12. 【记住密码】vue项目实现记住密码功能
  13. 使用NATAPP内网穿透
  14. vim中使用color_coded为c/cpp文件配色
  15. Dapr+Net6 服务调用02:本地负载均衡(self-hosted)
  16. 300兆的网速测试软件,300兆的网速是多少(300兆宽带测网速应该是多少)
  17. 巧设BIOS,让老主板也支持U盘启动!
  18. 数据结构 之 无向连通图
  19. C#FFmpeg视频采集与推送RTMP服务器代码思路整理
  20. hive3.x异常- return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask

热门文章

  1. 博弈论 —— matlab
  2. R语言基础入门(3)之数据类型与相应运算1
  3. oracle tb级别数据量,备份TB级别Oracle数据库的一些技巧
  4. java scanner转string,Java InputStream to String 转化
  5. python lxml xpath_Python/lxml/Xpath:如何找到包含特定文本的行?
  6. cmd运行python程序
  7. 远程访问数据库查询数据量一大就Hang
  8. window覆盖导航栏
  9. 5.UiScrollable API 详细介绍
  10. 外国wince学习论坛收集