分享

hadoop官网帮助手册:第三章HDFS快照(HDFS Snapshots)

xuanxufeng 2016-2-12 15:11:25 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 20022



综述


HDFS快照是一个只读的基于时间点文件系统拷贝。快照可以是整个文件系统的也可以是一部分。常用来作为数据备份,防止用户错误和容灾。
HDFS实现了:

  • Snapshot 创建的时间 复杂度为O(1),但是不包括INode 的寻找时间
  • 只有当修改SnapShot时,才会有额外的内存占用,内存使用量为O(M),M 为修改的文件或者目录数
  • 在datanode 上面的blocks 不会复制,做Snapshot 的文件是纪录了block的列表和文件的大小,但是没有数据的复制
  • Snapshot 并不会影响HDFS 的正常操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。快照数据是当前数据减去修改的部分计算出来的。

可以被快照的目录


快照会存储在snapshottable的目录下。snapshottable下存储的snapshots 最多为65535个。没有限制snapshottable目录的数量。管理员可以设置任何的目录成为snapshottable。如果snapshottable里面存着快照,那么文件夹不能删除或者改名。
网络的snapshottable目录现在是不允许的。另外如果一个目录的父目录或者子目录是snapshottable,那么这个文件夹不能作为snapshottable。



快照的目录


对于一个snapshottable文件夹,".snapshot" 被用于进入他的快照 /foo 是一个snapshottable目录,/foo/bar是一个/foo下面的文件目录,/foo有一个快照s0,那么路径就是
[mw_shl_code=bash,true]/foo/.snapshot/s0/bar
[/mw_shl_code]

引用快照副本/foo/bar。常用的API和CLI能够在".snapshot" 的路径下运行。下面是一些例子。
列出snapshottable目录的所有快照

[mw_shl_code=bash,true]hdfs dfs -ls /foo/.snapshot
[/mw_shl_code]

列出在快照s0的所有文件

[mw_shl_code=bash,true]hdfs dfs -ls /foo/.snapshot/s0
[/mw_shl_code]

从s0拷贝一个文件:

[mw_shl_code=bash,true]hdfs dfs -cp /foo/.snapshot/s0/bar /tmp
[/mw_shl_code]

注意 ".snapshot"这个名字已经被HDFS保留用户不能创建这个同名目录。如果".snapshot"正在被前一个版本的HDFS使用,他必须在升级之前重命名,否则会升级失败。


操作


管理员操作


本节的操作需要超级用户权限。
快照可用
快照目录建立。如果这个操作成果,那么目录会变成snapshottable。
命令


[mw_shl_code=bash,true]hdfs dfsadmin -allowSnapshot <path>
[/mw_shl_code]

参数:



pathThe path of the snapshottable directory.



同时请参考在HdfsAdmin中 void allowSnapshot(Path path)的API。
快照不可用
文件夹里面的所有快照在失效快照前必须被删除,如果没有该目录会被建立。
命令:
[mw_shl_code=bash,true]hdfs dfsadmin -disallowSnapshot <path>
[/mw_shl_code]
参数


pathThe path of the snapshottable directory.


同时请参考在HdfsAdmin中 void disallowSnapshot(Path path)的API。

用户操作

本小节描述用户操作。注意HDFS超级用户可以执行所有的操作除了有权限的需求的操作。
创建快照
snapshottable目录创建一个快照。这个操作需要snapshottable目录的权限。
命令

[mw_shl_code=bash,true]hdfs dfs -createSnapshot <path> [<snapshotName>]
[/mw_shl_code]


参数:
pathThe path of the snapshottable directory.
snapshotName快照名字。如果没有指定,会用时间戳生成一个默认的名字格式是"'s'yyyyMMdd-HHmmss.SSS", 例如 "s20130412-151029.033".
可以createSnapshot(Path path)和createSnapshot(Path path, String snapshotName)在文件系统中的API,方法的返回值是snapshot 路径

删除快照
从一个snapshottable目录删除的快照。这个操作需要snapshottable目录的权限。

命令:


[mw_shl_code=bash,true]hdfs dfs -deleteSnapshot <path> <snapshotName>
[/mw_shl_code]


参数:

pathThe path of the snapshottable directory.
snapshotName快照名字
参考FileSystem类void deleteSnapshot(Path path, String snapshotName)的API
重命名快照
重命名快照。这个命令也需要snapshottable目录的权限。

命令:


[mw_shl_code=bash,true]hdfs dfs -renameSnapshot <path> <oldName> <newName>
[/mw_shl_code]
参数:
pathThe path of the snapshottable directory.
oldName老的快照名字
newName新的快照名字
参考FileSystem类 void renameSnapshot(Path path, String oldName, String newName) 的API

得到snapshottable目录列表

获取当前用户的所有snapshottable。

命令:

[mw_shl_code=bash,true]hdfs lsSnapshottableDir
[/mw_shl_code]


参数: 无

参考DistributedFileSystem类 SnapshottableDirectoryStatus[] getSnapshottableDirectoryListing() 的API
获取快照差异报告
得到两个快照之间的不同。需要两个目录的权限。
命令:

[mw_shl_code=bash,true]hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
[/mw_shl_code]
参数:
pathThe path of the snapshottable directory.
fromSnapshot开始的快照名字
toSnapshot结束的快照名字。
参考DistributedFileSystem类 SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot) 的API










没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条