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