概述

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”)报告重命名目录下的文件/目录的更改。