说明:因为最近正好在研究hadoop的快照机制,看官网上的文档讲的很细致,就顺手翻译了。也没有去深究一些名词的标准译法,所以可能有些翻译和用法不是很正确,莫要介意~~
原文地址:(Apache hadoop的官方文档) https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html
快照snapshots是HDFS文件系统的只读的基于某时间点的拷贝,可以针对某个目录,或者整个文件系统做快照。快照比较常见的应用场景是数据备份,以防一些用户错误或灾难恢复。
快照的高效性实现:(2) 只有当涉及到快照目录的修改被执行时,才会产生额外的内存消耗。而且内存消耗为O(M),其中M是被修改的文件或目录数。
(3) 创建快照时,block块并不会被拷贝。快照文件中只记录了block列表和文件大小,不会做任何数据拷贝。
(4) 快照不会对正常的HDFS操作有任何影响:创建快照以后发生的修改操作,被按操作时间的倒序(from newer to older)记录下来。所以当前的数据能被直接获取,而快照点的数据,则通过在当前的数据基础上减去执行过的操作来获取。
-- 所以我理解时间越久的快照,要获取就需要越长的时间。
我们可以在任何被设置为snapshottable的目录上执行快照,对一个目录最多可以创建65536个快照。管理员可以把任何目录设置为snapshottable,没有限制。如果一个目录下已经存在快照,那么只有当先删除所有快照后才能对这个目录进行删除和重命名等操作。
不允许嵌套的snapshottable目录。也就是说,如果一个目录被设置为snapshottable,那么它的父目录和子目录都不允许被设置为snapshottable。
就是/foo/bar目录对应的快照。可以通过".snapshot"路径直接访问和操作快照数据。例如:/foo/.snapshot/s0/bar
hdfs dfs -ls /foo/.snapshot
hdfs dfs -ls /foo/.snapshot/s0
hdfs dfs -cp /foo/.snapshot/s0/bar /tmp
只有集群的管理员才有权限进行如下操作。
把一个目录设置为snapshottable,就是设置允许对一个目录创建快照。
hdfs dfsadmin -allowSnapshot
对应的API为HdfsAdmin中的void allowSnapshot(Path path)。
把原本snapshottable的目录设置为禁止快照,不允许对该目录创建快照。在对一个目录设置禁止快照之前,要先删除该目录的所有快照。
对应的API为HdfsAdmin中的void disallowSnapshot(Path path)。hdfs dfsadmin -disallowSnapshot
hdfs dfs -createSnapshot
[ ]
snapshotName是要创建的快照名,如果没有定义,默认取当前时间戳作为快照名。类似”"s20130412-151029.033“。
对应的API为FileSystem中的Path createSnapshot(Path path)和Path createSnapshot(Path path, String snapshotName)。
删除一个snapshottable目录的一个快照。删除操作也需要目录的所属人权限。
hdfs dfs -deleteSnapshot
对应的API为FileSystem中的void deleteSnapshot(Path path, String snapshotName)。
重命名一个快照。也需要该目录的所属人权限。
hdfs dfs -renameSnapshot
对应的API为FileSystem中的void renameSnapshot(Path path, String oldName, String newName)。
列出所有当前用户有权限获取的,允许快照的目录。
hdfs lsSnapshottableDir
对应的API为DistributeFileSystem中的snapshottableDirectoryStatus[] getSnapshottableDirectoryListing()。
对比两个快照。这个操作需要用户对两个快照目录同时具有读权限。
hdfs snapshotDiff
对应API为DistributeFileSystem中的SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)。