Hadoop官方文档——HDFS 快照

  |   0 评论   |   2,608 浏览

概述

HDFS 快照是对文件系统的某一时间点的只读拷贝,可以在文件系统或整个文件系统的子树上执行快照。快照的一些常见用例是数据备份,防止用户错误和灾难恢复。

HDFS快照的实现是高效的:

  • 快照创建是即时的:除了inode查找时间之外,成本是O(1)。

  • 仅当对快照进行修改时才使用额外的内存:内存使用量为O(M),其中M为已修改文件/目录的数量。

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

  • 快照不会影响正常的HDFS操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。 通过从当前数据中减去修改来计算快照数据。


可以创建快照的目录


一旦目录被设置为快照,就可以在任何目录上执行快照。 快照目录可以容纳65,536个同步快照。 快照目录的数量没有限制。 管理员可以将任何目录设置为snaphottable。 如果快照目录中有快照,则在删除所有快照之前,不能删除或重命名该目录。


目前不允许嵌套的快照目录。 换句话说,如果一个目录的一个祖先/后代是快照目录,则不能将目录设置为快照。


快照的Paths

对于快照目录,路径“.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


请注意,此示例使用preserve选项来保留timestamps, ownership, permission, ACLs 和 Attrs


升级到具有快照的HDFS版本


HDFS快照功能引入了一个新的保留路径名:.snapshot,用于与快照交互。 从旧版本的HDFS进行升级时,如果有.snapshot目录,需要首先重命名或删除,以避免与保留路径冲突。 有关详细信息,请参阅HDFS用户指南中的升级部分。


快照操作

管理员操作

本节中描述的操作需要超级用户权限。


允许快照


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


命令:

hdfs dfsadmin -allowSnapshot <path>

参数:

path:快照目录的路径。

另请参见HdfsAdmin中相应的Java API void allowSnapshot(Path path)。


禁止快照


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


命令:

hdfs dfsadmin -disallowSnapshot <path>

参数:

path:快照目录的路径。

另请参见HdfsAdmin中相应的Java API void disallowSnapshot(Path path)。


用户操作


本节介绍用户操作。请注意,HDFS超级用户可以在不满足各个操作的权限要求的情况下执行所有操作。


创建快照


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


命令:

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

参数:

path:快照目录的路径。

snapshotName:快照名称,它是可选参数。当省略时,使用格式为“'s'yyyyMMdd-HHmmss.SSS”的时间戳生成默认名称,例如。 “s20130412-151029.033”。

另请参见FileSystem中相应的Java API Path createSnapshot(Path path)和Path createSnapshot(Path path,String snapshotName)。在这些方法中返回快照路径。


删除快照


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


命令:

hdfs dfs -deleteSnapshot <path> <snapshotName>

参数:

path:快照目录的路径。

snapshotName:快照名称。

另请参见FileSystem中相应的Java API void deleteSnapshot(Path path,String snapshotName)。


重命名快照


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


命令:

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

参数:

path:快照目录的路径。

oldName:旧的快照名称。

newName:新的快照名称。

另请参见FileSystem中相应的Java API void renameSnapshot(Path path,String oldName,String newName)。


获取快照目录列表

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


命令:

hdfs lsSnapshottableDir

参数:无

另请参见分布式文件系统中相应的Java API SnapshottableDirectoryStatus [] getSnapshottableDirectoryListing()。


获取快照差异报告


获取两个快照之间的差异。此操作需要两个快照中的所有文件/目录的读访问权限。


命令:

hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>

参数:

path:快照目录的路径。

fromSnapshot:启动快照的名称。

toSnapshot:结束快照的名称。

结果:

+文件/目录已创建。

- 文件/目录已被删除。

M文件/目录已被修改。

R文件/目录已被重命名。

RENAME条目表示文件/目录已重命名,但仍在相同的snaphottable目录下。如果将文件/目录重命名为snaphottble目录之外,则文件/目录将被报告为已删除。从snaphottble目录外部重命名的文件/目录被报告为新创建。


快照差异报告不保证相同的操作顺序。例如,如果我们将目录“/foo”重命名为“/foo2”,然后将新数据附加到文件“/foo2/bar”,差异报告将是:


    R. /foo - > /foo2
    M. /foo /bar

    

即,重命名目录下的文件/目录上的更改将在重命名之前使用原始路径(上述示例中的“/foo/bar”)进行报告。

另请参见分布式文件系统中相应的Java API SnapshotDiffReport getSnapshotDiffReport(Path path,String fromSnapshot,String toSnapshot)。





读后有收获可以支付宝请作者喝咖啡