概述
HDFS快照是只读的文件系统的时间点的复制。快照可以照文件系统的一部分或者整个文件系统。快照的常见用例是数据备份,防止用户错误和灾难恢复。
HDFS快照的实现是高效的:
1. 快照的创建时瞬间的:包括inode查找的时间,代价是O(1)。
2. 只有在有相对于快照的修改是才耗费内存:内存使用时O(M),M是修改的文件/目录的数量。
3. 快照不会影响正常的HDFS操作:修改信息被按时间倒叙记录,以使当前的数据可被直接访问。快照数据通过从当前数据中截取修改信息被计算。
快照的目录
快照可作用到任何被设置为snapshottable的目录。一个目录的快照能够同时容纳65536个快照。快照的目录个数没有限制。管理员可以设置任何的目录是可被快照的。如果在一个被快照的目录中有快照,这个目录在所有的快照被删除前,不能被删除和重命名。嵌套的快照目录目前不允许。换句话说,如果在其父路径和子路径中有被设置为被快照的目录,这个目录不能再被快照。
快照路径
对于一个可被快照的目录,路径.snapshot被用来访问它的快照。假设/foo是一个快照目录,/foo/bar是一个/foo中的文件/目录,/foo有一个快照s0。路径
/foo/.snapshot/s0/bar
引用/foo/bar。常用的API或者CLI可以与.snapshot路径一起工作。下面是一些例子:
1. 在一个快照的目录下列出所有的快照
hdfs dfs -ls /foo/.snapshot
2. 列出快照s0中所有的文件
hdfs dfs -ls /foo/.snapshot/s0
3. 从快照s0中复制文件
hdfs dfs -cp /foo/.snapshot/s0/bar /tmp
升级到一个有快照的HDFS版本
HDFS快照特定介绍了一个用于与快照交互的保留的路径.snapshot。当从一个旧版本的HDFS升级时,已经存在的命名为.snapshot 的路径需要先被重命名或者删除以避免与暴露路径冲突。查看HDFS User Guide文档的Upgrade部分获取更多的信息。
快照操作
管理员操作
下面描述的操作需要超级用户权限。
允许快照
允许创建一个目录的快照。如果操作成功完成,目录变成照的。
命令:
hdfs dfsadmin -allowSnapshot <path>
参数:
Path 快照的目录的路径
也可以查看相应的JAVA API void HdfsAdmin#allowSnapshot(Path path)。
禁用快照
禁用一个目录可被创建快照。一个目录所有的快照必须在禁用之前被删除。
命令:
hdfs dfsadmin -disallowSnapshot <path>
参数:
Path 快照了个目录路径
也可以查看相应的JAVA API void HdfsAdmin#disallowSnapshot(Path path).
用户操作
本部分描述用户的操作。注意HDFS超级用户可以执行所有的操作,不用满足各个命令的权限需求。
创建快照
创建一个可被快照的目录的快照。这个操作需要是被快照的目录的拥有者。
命令:
hdfs dfs -createSnapshot <path> [<snapshotName>]
参数:
Path 被快照的目录
SnapshotName 快照的名字,这是一个可选参数。当被忽略时,用时间戳创建一个默认的名字,时间戳格式s'yyyyMMdd-HHmmss.SSS,例如s20130412-151029.033。
也可以查看相应的JAVA API FileSystem#createSnapshot(Path path)和FileSystem#createSnapshot(Pathpath,String snapshotName)。这两个方法会返回快照的路径。
删除快照
从快照的目录删除一个快照。这个操作需要是被快照的目录的拥有者。
命令:
hdfs dfs -deleteSnapshot <path> <snapshotName>
参数:
Path 快照的目录
snapshotName 快照的名字
也可以查看相应的JAVA API FileSystem# deleteSnapshot(Path path, StringsnapshotName) 。
重命名快照
重命名一个快照。这个操作需要是被快照的目录的拥有者。
命令:
hdfs dfs -renameSnapshot <path> <oldName> <newName>
参数:
Path 快照的路径
oldName 旧的snapshot名字
newName 新的snapshot名字
也可以查看相应的JAVA API FileSystem# renameSnapshot(Pathpath, String oldName, String newName).
得到快照的目录列表
获得当前用户下做了快照的目录列表
命令:
hdfs lsSnapshottableDir
参数:NONE
也可以查看JAVA API DistributedFileSystem# getSnapshottableDirectoryListing()。
获取快照的差异报告
获取两个快照的差异。这个操作需要两个snapshot的所有的文件/目录都有读权限。
命令:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
参数:
Path 快照的路径
fromSnapshot 开始的快照的名字
toSnapshot 结束的快照的名字
也可以查看相应的JAVA API DistributedFileSystem# getSnapshotDiffReport(Pathpath, String fromSnapshot, String toSnapshot) 。