HDFS快照(Snapshots)介绍

HDFS快照(Snapshots)是文件系统在某一时刻的只读副本。快照可以在文件系统的一个分支或者整个文件系统上生成。快照常用来备份数据,防止错误性的操作。本文为您介绍HDFS快照的目录、路径以及相关的快照操作。

背景信息

HDFS快照的特征如下:

  • 快照的创建是瞬时的:时间复杂度为O(1),不包括INode查找时间。

  • 仅当修改快照相关的数据时才会使用额外的内存:内存使用复杂度为O(M),其中M是修改的文件或目录的数量。

  • DataNode中的数据块不会被复制:快照文件仅记录块列表和文件大小,不涉及数据复制。

  • 快照不会对常规的HDFS操作造成不利影响:修改操作按照时间倒序记录,以便可以直接访问当前最新的数据。快照数据是通过当前数据减去修改的部分计算得到的。

快照目录

当目录被设置为允许快照时才会生成快照。一个快照目录可以同时容纳65536个快照。快照目录的数量是没有限制的。管理员可以将任何目录设置为快照。如果一个目录中有快照,则在删除所有快照之前,既不能删除也不能重命名该目录。

不允许级联的快照目录。如果一个目录的父目录或者子目录是快照目录,则不能将该目录设置为快照。

快照路径

对于一个快照目录,访问时需要添加/.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
    说明

    该示例使用-ptopax参数来保留时间戳、所有权、权限、ACL和XAttrs。

快照操作

  • 管理员操作

    说明

    以下管理员操作需要超级用户权限。

    • 允许快照

      允许创建目录的快照。如果操作成功完成,该目录将变为可快照目录。

      hdfs dfsadmin -allowSnapshot <path>
    • 禁止快照

      禁止创建目录的快照。在禁止快照之前,必须删除该目录的所有快照。

      hdfs dfsadmin -disallowSnapshot <path>
  • 用户操作

    说明

    HDFS超级用户可以执行以下所有操作。

    • 创建快照

      创建目录的快照。该操作需要快照目录的所有者权限。

      hdfs dfs -createSnapshot <path> [snapshotName]
      说明

      本文代码示例中的[snapshotName]表示快照名称,是一个可选参数。当其省略时,默认的名称是使用时间戳syyyyMMdd-HHmmss.SSSS的格式表示,例如,s20130412-151029.033。

    • 删除快照

      从快照目录中删除快照。该操作需要快照目录的所有者权限。

      hdfs dfs -deleteSnapshot <path> <snapshotName>
    • 重命名快照

      重命名一个快照。该操作需要快照目录的所有者权限。

      hdfs dfs -renameSnapshot <path> <oldName> <newName>
      说明

      本文代码示例中的<oldName>表示原快照名称,<newName>表示新快照名称。

    • 获取快照目录列表

      获取当前用户拥有快照权限的所有快照目录。

      hdfs lsSnapshottableDir
    • 获取快照区别报告

      获取两个快照之间的区别。该操作需要快照内所有文件或目录的读权限。

      hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
      说明

      本文代码示例中的<fromSnapshot>表示原快照,<toSnapshot>表示待对比的快照。