HDFS Snapshots

来源:互联网 发布:算法的时间复杂度 编辑:程序博客网 时间:2024/06/05 08:01

概述

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) 。

0 0
原创粉丝点击