目录
概述
可快照的目录
快照路径
升级到支持快照的HDFS版本
快照操作
管理员操作
允许快照
不允许快照
用户操作
创建快照
删除快照
快照重命名
获取快照目录列表
获取快照差异报告
概述
HDFS 快照(Snapshots)是文件系统在特定时间点生成的只读备份。快照可以在文件系统的一个子分支或整个文件系统上生成。快照的常见使用场景就是数据的备份,以达到容错容灾的目的。
- 快照的创建是瞬时的:复杂度为O(1)(不包含inode查找时间)。
- 仅当对快照进行修改时才使用额外的内存:内存使用空间复杂度是O(M),其中M是修改的文件/目录的数量。
- DataNode里的数据块不会被复制:快照文件只对数据块,数据块的大小进行记录,不产生数据复制。
- 快照不会对常规HDFS操作产生负面影响:修改是按时间倒序记录的,因此可以直接访问当前数据。快照数据是通过从当前数据中减去修改来计算的。
可快照的目录
要对目录做快照的话,首先得将其设置为可快照的目录。一个可快照的目录能够容纳65,536个同时快照。可快照目录的数量是没有限制的。管理员可以将任何目录设置为可快照的。如果一个目录中有快照,那么在删除所有快照之前,既不能删除该目录,也不能重命名该目录。
快照目录的嵌套目前(版本:3.2.1)是不允许的。换言之,如果一个目录的父/子目录之一是可快照目录,则这个目录不能再被设置为可快照目录。
快照路径
对于可快照的目录,路径下会生成一个.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
- 从快照中复制文件
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
请注意,本示例使用了preserve选项来保存时间戳、所有权、权限、acl和XAttrs。
升级到支持快照的HDFS版本
HDFS快照特性引入了一个新的快照路径名,用于与快照交互:.snapshot。当从不支持快照的旧版本HDFS升级时,命名为.snapshot的现有路径需要先被重命名或删除,以避免与保留路径冲突。
快照操作
管理员操作
本节中描述的操作需要超级用户权限。
允许快照
允许创建目录的快照。如果操作成功完成,该目录将成为可快照目录。
hdfs dfsadmin -allowSnapshot <path>
不允许快照
禁止创建目录的快照。在禁止快照之前,必须删除目录的所有快照。
hdfs dfsadmin -disallowSnapshot <path>
用户操作
本部分描述用户操作。请注意,HDFS超级用户可以执行所有操作,而不需要满足单个操作的权限要求。
创建快照
hdfs dfs -createSnapshot <path> [<snapshotName>]
创建可快照目录的快照。该操作需要快照目录的所有者权限。
删除快照
从可快照目录中删除快照。该操作需要快照目录的所有者权限。
hdfs dfs -deleteSnapshot <path> <snapshotName>
快照重命名
重命名一个快照。该操作需要snapshottable目录的所有者权限。
hdfs dfs -renameSnapshot <path> <oldName> <newName>
获取快照目录列表
获取当前用户拥有快照权限的所有可快照目录。
hdfs lsSnapshottableDir
获取快照差异报告
获取两个快照之间的差异。此操作需要两个快照中所有文件/目录的读访问权限。
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
注意,snapshotDiff可以用来获取两个快照之间的差异报告,或者快照与目录的当前状态之间的差异报告。用户可以使用“.”来表示当前状态。
+ | 表明这个文件/目录被创建 |
- | 表明这个文件/目录被删除 |
M | 表明这个文件/目录被修改 |
R | 表明这个文件/目录被重命名 |
重命名项表示文件/目录已被重命名,但仍然位于相同的目录下。如果文件/目录被重命名到目录之外,则报告为已删除。从目录外部重命名的文件/目录标识为新创建的。
快照差异报告不能保证相同的操作序列。例如,如果我们重命名目录" /foo "为" /foo2 ",然后追加新的数据到文件" /foo2/bar ",差异报告将是:
R. /foo -> /foo2
M. /foo/bar