Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

总览

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

HDFS快照的实施非常有效:

  • 快照创建是瞬时的:不包括inode查找时间在内的开销为O(1)

  • 仅在相对于快照进行修改时才使用附加内存:内存使用量为O(M),其中M是已修改文件/目录的数量。

  • 不会复制datanode中的块:快照文件记录了块列表和文件大小。没有数据复制。

  • 快照不会对HDFS的常规操作产生不利影响:修改记录以相反的时间顺序进行,因此可以直接访问当前数据。通过从当前数据中减去修改来计算快照数据。

快照目录

将目录设置为snapshottable后,可以在任何目录上拍摄快照。快照表目录能够容纳65,536个同时快照。快照表目录的数量没有限制。管理员可以将任何目录设置为快照表。如果快照表目录中有快照,则在删除所有快照之前,不能删除或重命名该目录。

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

快照路径

对于快照表目录,路径组件“ .snapshot”用于访问其快照。假设/富是一个snapshottable目录/富/酒吧是一个文件/目录/富,和/富具有快照S0。然后,路径/foo/.snapshot/s0/bar引用/ foo / bar的快照副本。常用的API和CLI可以使用“ .snapshot”路径。以下是一些示例。

  • 列出snapshottable目录下的所有快照:

    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版本

HDFS快照功能引入了用于与快照进行交互的新保留路径名:.snapshot。从不支持快照的较旧版本的HDFS升级时,需要首先重命名或删除现有的名为.snapshot的路径,以避免与保留的路径发生冲突。有关更多信息,请参见HDFS用户指南中的升级部分。

快照操作

管理员操作

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

允许快照

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

  • 命令:

    hdfs dfsadmin -allowSnapshot <路径>
    
  • 参数:

    路径 快照表目录的路径。

另请参见相应的Java API 无效allowSnapshot(路径路径)HdfsAdmin

禁止快照

不允许创建目录的快照。必须先删除目录的所有快照,然后再禁止快照。

  • 命令:

    hdfs dfsadmin -disallowSnapshot <路径>
    
  • 参数:

    路径 快照表目录的路径。

另请参见相应的Java API 无效disallowSnapshot(路径路径)HdfsAdmin

用户操作

本节介绍用户操作。请注意,HDFS超级用户可以执行所有操作,而无需满足单个操作中的许可要求。

创建快照

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

  • 命令:

    hdfs dfs -createSnapshot <路径> [<快照名称>]
    
  • 参数:

    路径 快照表目录的路径。
    快照名称 快照名称,这是一个可选参数。如果省略该名称,则会使用带有格式“'s'yyyyMMdd-HHmmss.SSS”的时间戳生成默认名称,例如“ s20130412-151029.033”

另请参见相应的Java API 路径createSnapshot(路径路径)路径createSnapshot(路径路径字符串snapshotName)文件系统快照路径在这些方法中返回。

删除快照

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

  • 命令:

    hdfs dfs -deleteSnapshot <路径> <快照名称>
    
  • 参数:

    路径 快照表目录的路径。
    快照名称 快照名称。

另请参见相应的Java API 无效deleteSnapshot(路径路径字符串snapshotName)文件系统

重命名快照

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

  • 命令:

    hdfs dfs -renameSnapshot <路径> <旧名称> <新名称>
    
  • 参数:

    路径 快照表目录的路径。
    旧名称 旧的快照名称。
    新名字 新的快照名称。

另请参见相应的Java API 无效renameSnapshot(路径路径,字符串使用oldName,字符串newName)将文件系统

获取Snapshottable目录列表

获取当前用户有权拍摄快照的所有快照表目录。

  • 命令:

    hdfs lsSnapshottableDir
    
  • 参数:无

另请参见相应的Java API SnapshottableDirectoryStatus [] getSnapshottableDirectoryListing()DistributedFileSystem

获取快照差异报告

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

  • 命令:

    hdfs snapshotDiff <路径> <fromSnapshot> <toSnapshot>
    
  • 参数:

    路径 快照表目录的路径。
    fromSnapshot 起始快照的名称。
    快照 结束快照的名称。

    请注意,snapshotDiff可用于获取两个快照之间或快照与目录的当前状态之间的差异报告。用户可以使用“。” 代表当前状态。

  • 结果:

    + 文件/目录已创建。
    -- 文件/目录已被删除。
    中号 文件/目录已被修改。
    [R 文件/目录已重命名。

一个RENAME条目表示一个文件/目录已被重命名,但仍然是相同的snapshottable目录下。如果将文件/目录重命名为快照目录的外部,则报告为已删除。从快照目录外部重命名的文件/目录被报告为新创建的。

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

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

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

另请参见相应的Java API SnapshotDiffReport getSnapshotDiffReport(路径路径,字符串fromSnapshot,字符串toSnapshot)DistributedFileSystem