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的快照的实现非常高效:
快照的创建是即时的,快照的创建非常迅速:因为除去了文件系统上inode的查找时间,所以创建快照的成本为:O(1)
只有对快照做修改的时候,才会消耗一点内存:内存的使用为:O(M),其中【M】指的是被修改的文件或者目录的数量
在做快照的时候,存放在DataNode上的Block(HDFS数据块)并不会被复制:快照文件会记录文件的大小以及文件包含的一个或者多个Block的列表;因此,做快照的时候,并没有数据的复制
快照的操作并不会对常规的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】路径组件。
接下来,是一些访问与操作的样例:
查看【可快照】目录下的所有快照;
[ ]
Found 2 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:18 /foo/.snapshot/s0
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo/.snapshot/s1
[ ]
查看,其中快照【s0 / s1】中的文件:
[ ]
Found 1 items
-rw-r--r-- 3 hdfs supergroup 0 2020-06-04 08:46 /foo/.snapshot/s0/bar
[ ]
[ ]
Found 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
[ ]
将一个快照【s1】中的文件,以保留权限信息的方式恢复(复制)到目录【/tmp】:
[ ]
Found 3 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo
drwxrwxrwt - hdfs supergroup 0 2020-04-09 20:36 /tmp
drwxr-xr-x - hdfs supergroup 0 2020-06-04 08:40 /user
[ ]
[ ]
Found 2 items
d--------- - hdfs supergroup 0 2020-06-04 09:22 /tmp/.cloudera_health_monitoring_canary_files
drwxrwxrwt - mapred hadoop 0 2020-04-09 20:35 /tmp/logs
[ ]
[ ]
[ ]
[ ]
Found 3 items
d--------- - 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/hosts
drwxrwxrwt - mapred hadoop 0 2020-04-09 20:35 /tmp/logs
[ ]
注意,上面在恢复(复制)的时候,通过【-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
你可以对快照做什么?
接下来,会描述对【快照】可以执行哪些操作;
按照操作人员的权限来划分,对快照的操作可以大体上划分为两类:
管理员操作
普通用户操作
接下来会分别描述,并给出详细的命令演示及其反馈结果。
04
快照操作:管理员
通过本小节的名字就可以看到,接下来描述的所有操作,都需要你具有【超级管理员 / superuser】的权限(Privilege)。
一、标记目录【是否为:可快照】
允许某个目录是否可以创建快照;
如果操作成功了,那么目标目录就是【可快照】的状态;
具体操作如下:
[ ]
Found 3 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo
drwxrwxrwt - hdfs supergroup 0 2020-06-04 09:23 /tmp
drwxr-xr-x - hdfs supergroup 0 2020-06-04 08:40 /user
[ ]
[ ]
[ ]
[ ]
Allowing snapshot on /snapshottable_directory succeeded
[ ]
如上,这样就成功的允许某个目录为【可快照】状态了。
上面命令的语法是:
hdfs dfsadmin -allowSnapshot <path>
其中【path】,为你的目标目录 / The path of the snapshottable directory.;
上面是允许目录为【可快照】,接下来是禁用目录为【可快照】:
[ ]
Disallowing snapshot on /snapshottable_directory succeeded
[ ]
如上,这样就成功的回收了某个目录的【可快照】状态了。
上面命令的语法:
hdfs dfsadmin -disallowSnapshot <path>
其中【path】,为你的目标目录 / The path of the snapshottable directory.;
05
快照操作:用户
通过本小节的名字就可以看到,接下来描述的所有操作,普通用户的权限(Privilege)即可完成。
一、创建快照
对某个目录执行创建快照的操作,需要操作用户对这个目录具有【拥有人 / owner】的权限,并且,操作的目标目录,必须是【可快照】的;
操作:
[ ]
Disallowing snapshot on /snapshottable_directory succeeded
[ ]
[ ]
createSnapshot: Directory is not a snapshottable directory: /snapshottable_directory
[ ]
[ ]
Allowing snapshot on /snapshottable_directory succeeded
[ ]
[ ]
Created snapshot /snapshottable_directory/.snapshot/s0
[ ]
[ ]
Found 1 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:55 /snapshottable_directory/.snapshot/s0
[ ]
如上:
如果目标目录不是【可快照】的,那么会遇到错误:
createSnapshot: Directory is not a snapshottable directory
最后,将目标目录修改为了【可快照】的之后,执行快照的创建,就没有问题了。
创建快照的语法详情为:
hdfs dfs -createSnapshot <path> [<snapshotName>]
其中:
path,目标目录
snapshotName,你要创建的快照的名字;
快照的名字(snapshotName)是一个可选的参数,当它被忽略的时候,快照的名称会按照默认的规则生成:
以规则【"'s'yyyyMMdd-HHmmss.SSS"】自动生成的时间戳;
例如:【"s20130412-151029.033"】
二、删除快照
将某个【可快照】目录中的某个快照删除
操作:
[ ]
Found 1 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:55 /snapshottable_directory/.snapshot/s0
[ ]
[ ]
[ ]
[ ]
[ ]
可以看到,快照【s0】被成功删除了。
上述命令语法如下:
hdfs dfs -deleteSnapshot <path> <snapshotName>
三、重命名快照
操作:
[ ]
Created snapshot /snapshottable_directory/.snapshot/s20200604-114150.174
[ ]
[ ]
Found 1 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 11:41 /snapshottable_directory/.snapshot/s20200604-114150.174
[ ]
[ ]
[ ]
[ ]
Found 1 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 11:41 /snapshottable_directory/.snapshot/snap_01
[ ]
可以看到,快照名称修改完成。
上面操作的命令的语法是:
hdfs dfs -renameSnapshot <path> <oldName> <newName>
四、获得【可快照】目录的列表
操作:
[ ]
drwxr-xr-x 0 hdfs supergroup 0 2020-06-04 09:21 2 65536 /foo
drwxr-xr-x 0 hdfs supergroup 0 2020-06-04 11:41 1 65536 /snapshottable_directory
drwxr-xr-x 0 hdfs supergroup 0 2020-06-04 08:40 0 65536 /user
[ ]
可以看到,当前的HDFS中,启用了【可快照】的目录都被列出来了。
上述命令的语法如下:
hdfs lsSnapshottableDir
五,比较两个快照的差异
操作:
[root@cloudera2 ~]# hdfs dfs -ls /foo/.snapshot
Found 2 items
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:18 /foo/.snapshot/s0
drwxr-xr-x - hdfs supergroup 0 2020-06-04 09:21 /foo/.snapshot/s1
[root@cloudera2 ~]# hdfs snapshotDiff /foo s0 s1
Difference 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)