写在前面
本文隶属于专栏《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系统最常用的方式。