本文是官方文档的翻译固定链接为:https://www.askmac.cn/archives/hadoop-snapshots.html
原文链接:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html
1概述
HDFS 快照是文件系一个时间点的只读的副本。快照可以是部分文件系统,或者整个文件系统。一些场景使用快照的场景是数据备份,防止用户误操作和灾难恢复。
使用HDFS 快照是高效的:
- 快照创建是瞬间的:成本是0(1)排除查找信息节点的时间 。
- 额外的内存使用仅仅当对快照进行修改时产生:内存使用时0(M),M是修改文件/目录的数量。
- 在datanode中的块不会被拷贝:快照文件记录这些块列表和文件大小。不会产生数据拷贝。
- 快照不会对日常的HDFS操作产生不利的影响:修改被按反向时间排序记录,这样当前数据可以直接的访问。快照数据是由当前数据减去修改数据计算出来的(www.askmac.cn)。
1.1 snapshottable目录
快照可以产生在任何被设置为snapshottable的目录中。一个snapshottable目录可以同时容纳65536个快照。snapshottable目录没有个数上限,管理员可以设置任意个snapshottable。如果一个snapshottable中存在快照,那么这个目录在删除所有快照之前,不能删除或改名。
嵌套的snapshottable目录在现在并不支持。换句话说,如果一个目录的父目录/子目录是一个snapshottable目录的话,那么其不能设置为snapshottable。
1.2 快照 路径
对于一个snapshottable目录,”.snapshot”组件有利于访问其快照。假设/foo是一个snapshottable目录,/foo/bar是 /foo中的一个文件/目录,/foo有一个快照s0,那么这个路径
/foo/.snapshot/s0/bar
列出一个snapshottable目录中所有的快照:关联到快照副本/foo/bar。一般的API和CLI都可以在”.snapshot”路径上工作。下面是一些例子
hdfs dfs -ls /foo/.snapshot
- 列出在快照s0中的文件:
hdfs dfs -ls /foo/.snapshot/s0
- 从快照s0中拷贝文件:
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
注意这个例子使用了保存选项来保存时间戳,所有权,权限,ACLS和XAttrs
2 在有快照的时候升级HDFS版本
HDFS快照特性引用了一个新的保留路径名,来进行快照交互:.snapshot。当HDFS从一个旧版本升级时,现存的路径名称.snapshot需要首先重命名或者删除,来避免保留路径的冲突。更多详细类容,参考HDFS用户指南升级部分(www.askmac.cn)。
3快照操作
3.1管理员操作
本节中描述的操作需要超级用户权限
允许快照
允许一个快照目录被创建。如果这个操作成功完成,这个目录就变成snapshottable
- 命令:
hdfs dfsadmin -allowSnapshot <path>
- 参数:
path snapshottable目录的路径
禁止快照
禁止快照目录创建。在静止快照之前目录中的所有快照必须删除。
- 命令:
hdfs dfsadmin -disallowSnapshot <path>
- 参数
path snapshottable目录的路径
也可以参考Hdfsadmin中相关JAVA API void disallowSnapshot(Path path)
3.2 用户操作
本节介绍用户操作。注意HDFS超级用户,可以执行除了个人操作需要满足的安全权限之外的所有操作(www.askmac.cn)。
创建快照
在snapshottable目录中创建一个一个快照。这个操作需要拥有snapshottabl目录所有者权限。
- 命令
hdfs dfs -createSnapshot <path> [<snapshotName>]
- 参数:
path | snapshottable目录的路径 |
snapshotName | 快照的名称,是一个可选参数。当其省略时,默认的名称是使用时间戳”s’yyyyMMdd-HHmmss.SSSS”的格式,例如”s20130412-151029.033″ |
也可以参考文件系统中相关JAVA API Path createSanpshot(Path path)和Path createSnapshot(Path path,String snapshotName)。在这些方法中返回了快照路径。
删除快照
从一个snapshottable目录中删除快照。这个操作需要拥有snapshottabl目录所有者权限(www.askmac.cn)。
- 命令
hdfs dfs -deleteSnapshot <path> <snapshotName>
- 参数:
path | snapshottable目录的路径 |
snapshotName | 快照名称 |
重命名快照
重命名一个快照。这个操作需要拥有snapshottabl目录所有者权限。
- 命令:
hdfs dfs -renameSnapshot <path> <oldName> <newName>
- 参数:
path | snapshottable目录的路径 |
oldName | 旧的快照名 |
newName | 新的快照名 |
也可以参考文件系统中相关JAVA API void renameSnapshot(Path path, String oldName, String newName)
获得snapshottable目录列表
获得当前用户有权限产生快照的所有snapshottabl目录
- 命令:
hdfs lsSnapshottableDir
- 参数:无
也可以参考分布式文件系统中相关JAVA API SnapshottableDirectoryStatus[] getSnapshottableDirectoryListing()
获得 快照差异报告
在2个快照之间获得差异。这个操作需要在2个快照中,所有文件/目录的读和访问权限(www.askmac.cn)。
- 命令:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
- 参数:
path | snapshottable目录的路径 |
fromSnapshot | 开始快照的名称 |
toSnapshot | 结束快照的名称 |
- 结果:
+ | 文件/目录 被创建 |
_ | 文件/目录 被删除 |
M | 文件/目录 被修改 |
R | 文件/目录 被重命名 |
一个RENAME提示一个文件/目录被重命名,但是仍然存在相同的snapshottable目录中。如果一个文件/目录被重命名到snapshottable目录外,那么会打印为删除。从snapshottable目录之外重命名进来的文件/目录,被打印为新创建。
快照差异报告不能保证相同操作的顺序。例如,如果我们将目录”/foo”重命名为”/foo2″,然后增加一个新文件为”/foo2/bar”,这个差异报告将是:
R. /foo -> /foo2 M. /foo/bar
即,在一个目录重命名下的文件/目录 变更,在报告的时候,是使用原来未重命名之前的名称。(例如上面的”/foo/bar”)
也可以参考分布式文件系统中相关JAVA API SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)
Comment