HDFS快照snapshot功能
概览
HDFS 快照是文件系统的只读时间点副本。可以在文件系统或整个文件系统的子树上拍摄快照。快照的一些常见用例是数据备份、防止用户错误和灾难恢复。
HDFS 快照的实现是有效的:
- 快照创建是即时的: 不包括 inode 查找的话,时间的成本为 o (1)。
- 只有在相对于快照进行修改时才使用额外的内存: 内存使用为 o (m) ,其中 m 是修改的文件/目录的数量。
- 不复制数据节点中的块: 快照文件记录块列表和文件大小。没有数据复制。
- 快照不会对常规的 HDFS 操作产生不利影响: 修改按时间倒序记录,以便可以直接访问当前的数据。快照数据是通过从当前数据中减去修改得到的。
快照目录
一旦目录被设置为 snapshotable,就可以在任何目录上拍摄快照。一个快照目录可以同时容纳65,536个快照。快照目录的数量是没有限制的。管理员可以将任何目录设置为快照。如果 snapshottable 目录中有快照,则在删除所有快照之前,既不能删除也不能重命名该目录。
当前不允许嵌套的快照目录。换句话说,如果一个目录的一个祖先/后代是一个 snapshotable 目录,则不能将该目录设置为 snapshotable。
快照路径
对于一个快照目录,path 组件“.snapshot” 用于访问其快照。假设/foo 是一个 snapshottable 目录,/foo/bar 是/foo 中的一个文件/目录,而/foo 有一个 snapshot s0。然后/foo/.snapshot/s0/bar指的是/foo/bar 的 snapshot 副本。通常的 API 和 CLI 可以使用 “.snapshot”路径。以下是一些例子。
-
列出 snapshotable 目录下的所有快照:
hdfs dfs -ls /foo/.snapshot
-
列出快照 s0中的文件:
hdfs dfs -ls /foo/.snapshot/s0
-
从快照 s0复制文件:
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
注意,这个示例使用了 preserve 选项来保留时间戳、所有权、权限、 acl 和 XAttrs。
快照操作
管理员操作
本节中描述的操作需要超级用户权限。
允许快照
允许创建目录的快照。如果操作成功完成,该目录将变为可快照目录。
-
命令:
hdfs dfsadmin -allowSnapshot <path>
禁止快照
禁止创建目录的快照。在禁止快照之前,必须删除该目录的所有快照。
-
命令:
hdfs dfsadmin -disallowSnapshot <path>
用户操作
本节描述用户操作。请注意,HDFS 超级用户可以执行所有操作,而不需要满足单个操作中的权限要求。
创建快照
创建快照目录的快照。这个操作需要快照目录的所有者权限。
-
命令:
hdfs dfs -createSnapshot <path> [<snapshotName>]
删除快照
从 snapshottable 目录中删除快照。这个操作需要 snapshottable 目录的所有者权限。
-
命令:
hdfs dfs -deleteSnapshot <path> <snapshotName>
重命名快照
重命名一个快照。这个操作需要 snapshotable 目录的所有者权限。
-
命令:
hdfs dfs -renameSnapshot <path> <oldName> <newName>
获取 snapshotable 目录列表
获取当前用户有权使用 snapshtos 的所有 snapshotable 目录。
-
命令:
hdfs lsSnapshottableDir
获取快照差异报告
获取两个快照之间的差异。此操作要求对两个快照中的所有文件/目录具有读访问权限。
-
命令:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
-
结果:
+ 已经创建了文件/目录 - 文件/目录已被删除 M 文件/目录已被修改 R 文件/目录已被重命名
RENAME 条目表示文件/目录已被重命名,但仍然位于相同的 snapshotable 目录下。如果文件/目录被重命名为 snapshottble 目录外部,则报告该文件/目录已被删除。从 snapshottble 目录外部重命名的文件/目录被报告为新创建的文件/目录。
快照差异报告不保证相同的操作顺序。例如,如果我们将目录“/foo”重命名为“/foo2”,然后将新数据附加到文件“/foo2/bar”,差异报告将是:
R. /foo -> /foo2
M. /foo/bar
也就是说,在重命名(上面示例中的“/foo/bar”)之前,使用原始路径报告重命名目录下的文件/目录的更改。