3.14 快照
HDFS snapshot 是 HDFS 整个文件系统,或者某个目录在某个时刻的镜像。该镜像并不会随着源目录的改变而进行动态的更新。可以将快照理解为拍照片时的那一瞬间的投影,过了那个时间之后,又会有新的一个投影。
HDFS 快照的核心功能包括:数据恢复、数据备份、数据测试。
数据恢复
可以通过滚动的方式来对重要的目录进行创建 snapshot 的操作,这样在系统中就存在针对某个目录的多个快照版本。当用户误删除掉某个文件时,可以通过最新的 snapshot 来进行相关的恢复操作
数据备份
可以使用 snapshot 来进行整个集群,或者某些目录、文件的备份。管理员以某个时刻的 snapshot 作为备份的起始结点,然后通过比较不同备份之间差异性,来进行增量备份
数据测试
在某些重要数据上进行测试或者实验,可能会直接将原始的数据破坏掉。可以临时的为用户针对要操作的数据来创建一个 snapshot,然后让用户在对应的 snapshot 上进行相关的实验和测试,从而避免对原始数据的破坏
了解 HDFS 快照功能如何实现之前,首先有一个根本的原则需要记住:快照不是数据的简单拷贝,快照只做差异的记录。这一原则在其他很多系统的快照概念中都是适用的,比如磁盘快照,也是不保存真实数据的。因为不保存实际的数据,所以快照的生成往往非常迅速。
在 HDFS 中,如果在其中一个目录比如 /input 下创建一个快照,则快照文件中将会存在与 /input 目录下完全一致的子目录文件结构以及相应的属性信息,通过命令也能看到快照里面具体的文件内容。但是这并不意味着快照已经对此数据进行完全的拷贝 。这里遵循一个原则:对于大多不变的数据,你所看到的数据其实是当前物理路径所指的内容,而发生变更的 inode 数据才会被快照额外拷贝,也就是所说的差异拷贝。
inode 译成中文就是索引节点,它用来存放文件及目录的基本信息,包含时间、名称、拥有者、所在组等信息。
HDFS 快照不会复制 datanode 中的块,只记录了块列表和文件大小。
HDFS 快照不会对常规 HDFS 操作产生不利影响,修改记录按逆时针顺序进行,因此可以直接访问当前数据。通过从当前数据中减去修改来计算快照数据。
快照启停
HDFS 中可以针对整个文件系统或者文件系统中某个目录创建快照,但是创建快照的前提是相应的目录开启快照的功能,如果针对没有启动快照功能的目录创建快照则会报错。
案例1:基于 /input 创建快照
hdfs dfs -createSnapshot /input启动快照
hdfs dfsadmin -allowSnapshot <snapshotDir>
关闭快照
hdfs dfsadmin -disallowSnapshot <snapshotDir>快照操作
快照相关的操作命令有:createSnapshot 创建快照、deleteSnapshot 删除快照、renameSnapshot 重命名快照、lsSnapshottableDir 列出可以快照目录列表、snapshotDiff 获取快照差异报告。
案例1:开启指定目录 /input 快照
hdfs dfsadmin -allowSnapshot /input
案例2:基于 /input 创建快照,快照的名称由系统指定
hdfs dfs -createSnapshot /input案例3:基于 /input 创建快照,快照的名称为 mysnap1
hdfs dfs -createSnapshot /input mysnap1
案例4:把快照名称 mysnap1 重命名为 mysnap2
hdfs dfs -renameSnapshot /input mysnap1 mysnap2
案例5:列出系统中所有快照
hdfs lsSnapshottableDir案例6:比较两个快照的不同之处
hdfs dfs -put /etc/passwd /input
hdfs dfs -createSnapshot /input mysnap3
hdfs snapshotDiff /input mysnap2 mysnap3
+ 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.
案例7:删除快照 mysnap2
hdfs dfs -deleteSnapshot /input mysnap2案例8:删除/input目录
hdfs dfs -rm -r /input
拥有快照的目录不允许被删除,目的保护文件安全