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”)之前,使用原始路径报告重命名目录下的文件/目录的更改。

posted @ 2021-02-01 20:36  数大招疯-公众号同名  阅读(333)  评论(0编辑  收藏  举报