HDFS | Snapshots(快照)

Posted Leviathan2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS | Snapshots(快照)相关的知识,希望对你有一定的参考价值。


不积跬步无以至千里。



01

题记


和前面文档的一样,本文通过对官方文档的翻译,来梳理相关的知识点。


本文将梳理关于:HDFS中的快照的内容


https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html


下面,开始。

02

总览


HDFS的快照是文件系统(HDFS)基于时间点的只读副本。

你可以对整个文件系统执行快照,或者对文件系统中的某个子目录(子树)执行快照。


通常情况下,我们执行快照的目的是为了保护数据,为了防止用户的误操作,或者出现了灾难性的事故后的数据恢复。


HDFS的快照的实现非常高效:

  1. 快照的创建是即时的,快照的创建非常迅速:因为除去了文件系统上inode的查找时间,所以创建快照的成本为:O(1)

  2. 只有对快照做修改的时候,才会消耗一点内存:内存的使用为:O(M),其中【M】指的是被修改的文件或者目录的数量

  3. 在做快照的时候,存放在DataNode上的Block(HDFS数据块)并不会被复制:快照文件会记录文件的大小以及文件包含的一个或者多个Block的列表;因此,做快照的时候,并没有数据的复制

  4. 快照的操作并不会对常规的HDFS操作造成负面的影响:所有的修改都会按照时间倒序排序,以便于可以直接访问当前的数据;快照的数据,是从当前的数据中减去修改的数据从而计算出来的


注意:

上面描述中的【O(1) / O(M)】为数学表达。


————————

一、哪些目录可以被快照呢?/ 可快照目录 Snapshottable Directories


只要某个目录被设置为【snapshottable / 可快照的】,那么这个目录就可以被快照了。


一个被设置为【可快照】的目录,最多可以包含【65536】个快照。


那么【可快照】的目录,是否有数量的限制?没有,你想设置多少个【可快照】的目录,你就可以设置多少个【可快照】目录。

管理员可以设置任意一个目录为【可快照】。


如果一个【可快照】的目录包含了快照,那么,这个目录既不能【被删除】,也不能【修改这个目录的名字】。除非,它包含的所有快照被删除。


嵌套的【可快照】目录,目前是不支持的。

也就是说,如果某个目录的父目录或者子目录为【可快照】目录,那么,这个目录就无法被设为【可快照】目录。


二、快照路径 / Snapshot Paths


对于一个【可快照】目录来说,路径组件(Path Component)【.snapshot】用于访问该【可快照】目录所包含的快照。


假如【/foo】是一个可快照目录;

【/foo/bar】是目录【/foo】中的一个文件或者目录;

并且【/foo】这个可快照目录包含一个快照【s0】;


那么,【/foo/.snapshot/s0/bar】就是【/foo/bar】的快照。


通常,我们使用API或者CLI(命令行工具)来访问与操作【.snapshot】路径组件。


接下来,是一些访问与操作的样例:


查看【可快照】目录下的所有快照;

[root@cloudera2 ~]# hdfs dfs -ls /foo/.snapshotFound 2 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:18 /foo/.snapshot/s0drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo/.snapshot/s1[root@cloudera2 ~]# 


查看,其中快照【s0 / s1】中的文件:

[root@cloudera2 ~]# hdfs dfs -ls /foo/.snapshot/s0Found 1 items-rw-r--r-- 3 hdfs supergroup 0 2020-06-04 08:46 /foo/.snapshot/s0/bar[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /foo/.snapshot/s1Found 2 items-rw-r--r-- 3 hdfs supergroup 0 2020-06-04 08:46 /foo/.snapshot/s1/bar-rw-r--r-- 3 hdfs supergroup 468 2020-06-04 09:20 /foo/.snapshot/s1/hosts[root@cloudera2 ~]# 


将一个快照【s1】中的文件,以保留权限信息的方式恢复(复制)到目录【/tmp】:

[root@cloudera2 ~]# hdfs dfs -ls /Found 3 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foodrwxrwxrwt - hdfs supergroup 0 2020-04-09 20:36 /tmpdrwxr-xr-x - hdfs supergroup 0 2020-06-04 08:40 /user[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /tmpFound 2 itemsd--------- - hdfs supergroup 0 2020-06-04 09:22 /tmp/.cloudera_health_monitoring_canary_filesdrwxrwxrwt - mapred hadoop 0 2020-04-09 20:35 /tmp/logs[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -cp -ptopax /foo/.snapshot/s1/hosts /tmp[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /tmpFound 3 itemsd--------- - hdfs supergroup 0 2020-06-04 09:23 /tmp/.cloudera_health_monitoring_canary_files-rw-r--r-- 3 hdfs supergroup 468 2020-06-04 09:20 /tmp/hostsdrwxrwxrwt - mapred hadoop 0 2020-04-09 20:35 /tmp/logs[root@cloudera2 ~]# 


注意,上面在恢复(复制)的时候,通过【-p / -ptopax】选项,保留了原文件的:时间戳、所有者、权限、ACLs和XAttrs信息。


HDFS快照的功能引入了一个用于与快照交互的新的路径组件【.snapshot】;


三、当你从一个不支持快照的旧版HDFS,升级到支持快照的HDFS的时候,你需要注意什么?


当对一个不支持快照的旧版本的HDFS做升级操作的时候,如果旧版本的HDFS中,已经存在了路径【.snapshot】,那么,这个路径要么删除、要么重命名,以避免升级到支持快照的HDFS版本后,与系统保留路径【.snapshot】发生冲突;


如果需要知道这方面的更详细的信息,可以参阅文档:《HDFS用户手册 / The HDFS User Guide》。

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Upgrade_and_Rollback


03

你可以对快照做什么?


接下来,会描述对【快照】可以执行哪些操作;

按照操作人员的权限来划分,对快照的操作可以大体上划分为两类:

  1. 管理员操作

  2. 普通用户操作


接下来会分别描述,并给出详细的命令演示及其反馈结果。


04

快照操作:管理员


通过本小节的名字就可以看到,接下来描述的所有操作,都需要你具有【超级管理员 / superuser】的权限(Privilege)。


一、标记目录【是否为:可快照】

允许某个目录是否可以创建快照;

如果操作成功了,那么目标目录就是【可快照】的状态;


具体操作如下:

[root@cloudera2 ~]# hdfs dfs -ls /Found 3 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foodrwxrwxrwt - hdfs supergroup 0 2020-06-04 09:23 /tmpdrwxr-xr-x - hdfs supergroup 0 2020-06-04 08:40 /user[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -mkdir /snapshottable_directory[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfsadmin -allowSnapshot /snapshottable_directoryAllowing snapshot on /snapshottable_directory succeeded[root@cloudera2 ~]# 


如上,这样就成功的允许某个目录为【可快照】状态了。


上面命令的语法是:

hdfs dfsadmin -allowSnapshot <path>

其中【path】,为你的目标目录 / The path of the snapshottable directory.


上面是允许目录为【可快照】,接下来是禁用目录为【可快照】:

[root@cloudera2 ~]# hdfs dfsadmin -disallowSnapshot /snapshottable_directoryDisallowing snapshot on /snapshottable_directory succeeded[root@cloudera2 ~]# 


如上,这样就成功的回收了某个目录的【可快照】状态了。


上面命令的语法:

hdfs dfsadmin -disallowSnapshot <path>

其中【path】,为你的目标目录 / The path of the snapshottable directory.


05

快照操作:用户

通过本小节的名字就可以看到,接下来描述的所有操作,普通用户的权限(Privilege)即可完成。


一、创建快照

对某个目录执行创建快照的操作,需要操作用户对这个目录具有【拥有人 / owner】的权限,并且,操作的目标目录,必须是【可快照】的;


操作:

[root@cloudera2 ~]# hdfs dfsadmin -disallowSnapshot /snapshottable_directoryDisallowing snapshot on /snapshottable_directory succeeded[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -createSnapshot /snapshottable_directory s0createSnapshot: Directory is not a snapshottable directory: /snapshottable_directory[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfsadmin -allowSnapshot /snapshottable_directory Allowing snapshot on /snapshottable_directory succeeded[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -createSnapshot /snapshottable_directory s0 Created snapshot /snapshottable_directory/.snapshot/s0[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /snapshottable_directory/.snapshotFound 1 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:55 /snapshottable_directory/.snapshot/s0[root@cloudera2 ~]# 


如上:

如果目标目录不是【可快照】的,那么会遇到错误:

createSnapshot: Directory is not a snapshottable directory


最后,将目标目录修改为了【可快照】的之后,执行快照的创建,就没有问题了。


创建快照的语法详情为:

hdfs dfs -createSnapshot <path> [<snapshotName>]

其中:

path,目标目录

snapshotName,你要创建的快照的名字;


快照的名字(snapshotName)是一个可选的参数,当它被忽略的时候,快照的名称会按照默认的规则生成:

以规则【"'s'yyyyMMdd-HHmmss.SSS"】自动生成的时间戳;

例如:【"s20130412-151029.033"


二、删除快照

将某个【可快照】目录中的某个快照删除


操作:

[root@cloudera2 ~]# hdfs dfs -ls /snapshottable_directory/.snapshotFound 1 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:55 /snapshottable_directory/.snapshot/s0[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -deleteSnapshot /snapshottable_directory s0[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /snapshottable_directory/.snapshot [root@cloudera2 ~]# 


可以看到,快照【s0】被成功删除了。


上述命令语法如下:

hdfs dfs -deleteSnapshot <path> <snapshotName>


三、重命名快照


操作:

[root@cloudera2 ~]# hdfs dfs -createSnapshot /snapshottable_directoryCreated snapshot /snapshottable_directory/.snapshot/s20200604-114150.174[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /snapshottable_directory/.snapshotFound 1 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 11:41 /snapshottable_directory/.snapshot/s20200604-114150.174[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -renameSnapshot /snapshottable_directory s20200604-114150.174 snap_01[root@cloudera2 ~]# [root@cloudera2 ~]# hdfs dfs -ls /snapshottable_directory/.snapshot Found 1 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 11:41 /snapshottable_directory/.snapshot/snap_01[root@cloudera2 ~]# 


可以看到,快照名称修改完成。


上面操作的命令的语法是:

hdfs dfs -renameSnapshot <path> <oldName> <newName>


四、获得【可快照】目录的列表


操作:

[root@cloudera2 ~]# hdfs lsSnapshottableDirdrwxr-xr-x 0 hdfs supergroup 0 2020-06-04 09:21 2 65536 /foodrwxr-xr-x 0 hdfs supergroup 0 2020-06-04 11:41 1 65536 /snapshottable_directorydrwxr-xr-x 0 hdfs supergroup 0 2020-06-04 08:40 0 65536 /user[root@cloudera2 ~]# 


可以看到,当前的HDFS中,启用了【可快照】的目录都被列出来了。


上述命令的语法如下:

hdfs lsSnapshottableDir


五,比较两个快照的差异


操作:

[root@cloudera2 ~]# hdfs dfs -ls /foo/.snapshotFound 2 itemsdrwxr-xr-x - hdfs supergroup 0 2020-06-04 09:18 /foo/.snapshot/s0drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo/.snapshot/s1[root@cloudera2 ~]# hdfs snapshotDiff /foo s0 s1Difference between snapshot s0 and snapshot s1 under directory /foo:M .+ ./hosts
[root@cloudera2 ~]#


可以看到,两个快照的差异比对出来了。


上述命令的语法:

hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>


关于这个命令反馈结果的内容的说明:

+ 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.


06


到这里,Apache Hadoop上的关于HDFS的Snapshot的官方文档就翻译完了。


以上是关于HDFS | Snapshots(快照)的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch备份快照到HDFS-2.6(CDH5.6.0)

ElasticSearch备份快照到HDFS-2.6(CDH5.6.0)

ElasticSearch索引快照

HA_Snapshots 数据库快照

snapshots On Vmware

HBase Snapshots 简介