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>表示待对比的快照。