写在前面

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系

解答

概述

HDFS快照(Snapshot)是文件系统在某一时刻只读的镜像;可以是一个完整的文件系统也可以是某个目录的镜像。

快照常用场景

防止用户的错误操作

管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。

如果用户意外地删除了一个文件, 可以使用包含该文件的最新只读快照来进行恢复。

备份

管理员可以根据需求来备份整个文件系统、一个目录或者单一文件。

管理员设置一个只读快照,并使用这个快照作为整个全量备份的开始点。

增量备份可以通过比较两个快照的差异来产生。

试验/测试

一个用户当想要在数据集上测试一个应用程序。

一般情况下, 如果不做该数据集的全量拷贝,测试应用程序会覆盖/损坏原来的生产数据集,这是非常危险的。

管理员可以为用户设置一个生产数据集的快照(Read write),以备用户测试使用。在快照上的改变不会影响原有数据集。

灾难恢复

只读快照可以被用于创建一个一致的时间点镜像,用于拷贝到远程站点作灾备冗余。

快照常用操作

Allow Snapshots

确定目录是否可以进行快照。

通过下面命令对某一个路径(根目录/,某一目录或者文件)开启快照功能,那么该目录就成为了一个 snapshottable 的目录;

一个 snapshottable下存储的 snapshots 最多为65535个,保存在该目录的.snapshot下;

但是 snapshottable数目并没有限制。

hdfs dfsadmin-allowSnapshot <path> 

示例:

[hadoop@node1 ~]$ hdfs dfsadmin -allowSnapshot /data
Allowing snapshot on /data succeeded

Create Snapshots

只有目录运行进行快照,才能在该目录下创建快照。

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

创建快照时可以指定快照名称,也可以不指定,系统可以自动生成快照名称

示例:
在这里插入图片描述

该快照会被立即创建出来,创建动作仅仅是在目录对应的Inode上加个快照的标签,因为此时快照目录里不包含任何实际数据。

不同的快照间采用硬链接的方式,引用相同的数据块,所以也不会涉及到数据块的拷贝操作;

而对文件的删除和追加,快照中的块将会指向所作的修改的块,所以也不会对读写性能有影响,但是会占用 NameNode 一定的额外内存来存放快照中被修改的文件和目录的元信息。

# 1. 创建临时文件夹
[hadoop@node1 ~]$ hdfs dfs -mkdir /data/tmp
# 2. 创建f1,f2,f3三个文件
[hadoop@node1 ~]$ hdfs dfs -touchz /data/tmp/f{1,2,3}
[hadoop@node1 ~]$ hdfs dfs -ls /data/tmp
Found 3 items
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f1
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f2
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f3
# 3. 新建快照s1
[hadoop@node1 ~]$ hdfs dfs -createSnapshot /data s1
Created snapshot /data/.snapshot/s1
# 4. 此时当前文件系统和 s1 中都包括 f1,f2,f3 三个文件
[hadoop@node1 ~]$ hdfs dfs -ls -R /data/.snapshot
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 21:55 /data/.snapshot/s0
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 22:00 /data/.snapshot/s1
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f1
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f2
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f3
# 5. 从快照中拷贝一个文件,将快照中的 f3文件拷贝到 hdfs 文件系统中,模拟文件恢复的场景
[hadoop@node1 ~]$ hdfs dfs -cp -ptopax /data/.snapshot/s1/tmp/f3 /data/tmp
cp: `/data/tmp/f3': File exists
[hadoop@node1 ~]$ hdfs dfs -cp -ptopax /data/.snapshot/s1/tmp/f3 /data/
[hadoop@node1 ~]$ hdfs dfs -ls -R /data
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/f3
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 21:59 /data/tmp
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f1
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f2
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/tmp/f3

Rename Snapshots

重命名 Snapshots

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

示例:

[hadoop@node1 ~]$ hdfs dfs -renameSnapshot /data s0 s_init
[hadoop@node1 ~]$ hdfs dfs -ls /data/.snapshot
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 22:00 /data/.snapshot/s1
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 21:55 /data/.snapshot/s_init

Get Snapshottable Directory Listing

通过 hdfs lsSnapshottableDir 来列出 Snapshottable的目录

示例:

[hadoop@node1 ~]$ hdfs lsSnapshottableDir
drwxr-xr-x 0 hadoop supergroup 0 2021-05-28 22:04 2 65536 /data

Get Snapshots Difference Report

比较两个快照之间的差异

hdfs snapshotDiff <path><fromSnapshot<toSnapshot>

示例:

[hadoop@node1 ~]$ hdfs snapshotDiff /data s_init s1
Difference between snapshot s_init and snapshot s1 under directory /data:
M       .
+       ./tmp

DeleteSnapshots

删除快照。

hdfs dfs -deleteSnapshot <path><snapshotName> 

示例:

[hadoop@node1 ~]$ hdfs dfs -deleteSnapshot /data s_init
[hadoop@node1 ~]$ hdfs dfs -ls -R /data/.snapshot
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 22:00 /data/.snapshot/s1
drwxr-xr-x   - hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f1
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f2
-rw-r--r--   3 hadoop supergroup          0 2021-05-28 21:59 /data/.snapshot/s1/tmp/f3

DisallowSnapshots

关闭 Snapshots

hdfs dfsadmin -disallowSnapshot <path> 

示例:

[hadoop@node1 ~]$ hdfs dfsadmin -disallowSnapshot /data
disallowSnapshot: The directory /data has snapshot(s). Please redo the operation after removing all the snapshots.
[hadoop@node1 ~]$ hdfs dfs -deleteSnapshot /data s1
[hadoop@node1 ~]$ hdfs dfsadmin -disallowSnapshot /data
Disallowing snapshot on /data succeeded

Snapshot 的作用

通过 Snapshot可以按照定时任务、或按固定时间间隔(例如每天)的方式创建文件快照,并删除过期的文件快照,减少业务误操作造成的数据损失;

快照的操作远低于外部备份开销,可作为备份HDFS系统最常用的方式。

上一篇 下一篇