hadoop2.x HDFS快照介绍,hadoop2.xhdfs快照


说明:因为最近正好在研究hadoop的快照机制,看官网上的文档讲的很细致,就顺手翻译了。也没有去深究一些名词的标准译法,所以可能有些翻译和用法不是很正确,莫要介意~~

原文地址:(Apache hadoop的官方文档) https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html


1. 概述

快照snapshots是HDFS文件系统的只读的基于某时间点的拷贝,可以针对某个目录,或者整个文件系统做快照。快照比较常见的应用场景是数据备份,以防一些用户错误或灾难恢复。

快照的高效性实现:
(1) 快照可以即时创建,耗时仅为O(1)。--excluding the inode lookup time

(2) 只有当涉及到快照目录的修改被执行时,才会产生额外的内存消耗。而且内存消耗为O(M),其中M是被修改的文件或目录数。

(3) 创建快照时,block块并不会被拷贝。快照文件中只记录了block列表和文件大小,不会做任何数据拷贝。

(4) 快照不会对正常的HDFS操作有任何影响:创建快照以后发生的修改操作,被按操作时间的倒序(from newer to older)记录下来。所以当前的数据能被直接获取,而快照点的数据,则通过在当前的数据基础上减去执行过的操作来获取。

-- 所以我理解时间越久的快照,要获取就需要越长的时间。 


1.1 快照目录

我们可以在任何被设置为snapshottable的目录上执行快照,对一个目录最多可以创建65536个快照。管理员可以把任何目录设置为snapshottable,没有限制。如果一个目录下已经存在快照,那么只有当先删除所有快照后才能对这个目录进行删除和重命名等操作。

不允许嵌套的snapshottable目录。也就是说,如果一个目录被设置为snapshottable,那么它的父目录和子目录都不允许被设置为snapshottable。


1.2 快照路径

快照被存放在一个被命名为.snapshot的目录中。比如/foo是一个snapshottable目录,/foo中有一个目录为/foo/bar,对/foo创建一个快照s0。那么 
/foo/.snapshot/s0/bar
就是/foo/bar目录对应的快照。可以通过".snapshot"路径直接访问和操作快照数据。例如:
  • 列出一个目录的所有快照:
hdfs dfs -ls /foo/.snapshot
  • 列出快照s0中的所有文件:
hdfs dfs -ls /foo/.snapshot/s0
  • 从快照中复制文件:

hdfs dfs -cp /foo/.snapshot/s0/bar /tmp


2. 快照操作


2.1 快照管理

只有集群的管理员才有权限进行如下操作。

允许快照

把一个目录设置为snapshottable,就是设置允许对一个目录创建快照。

hdfs dfsadmin -allowSnapshot <path>

对应的API为HdfsAdmin中的void allowSnapshot(Path path)。

禁止快照

把原本snapshottable的目录设置为禁止快照,不允许对该目录创建快照。在对一个目录设置禁止快照之前,要先删除该目录的所有快照。

hdfs dfsadmin -disallowSnapshot <Path>

对应的API为HdfsAdmin中的void disallowSnapshot(Path path)。


2.2 用户操作


创建快照 

为一个目录创建快照,只有目录的所属人权限能为这个目录创建快照。

hdfs dfs -createSnapshot <Path> [<snapshotName>]

snapshotName是要创建的快照名,如果没有定义,默认取当前时间戳作为快照名。类似”"s20130412-151029.033“。

对应的API为FileSystem中的Path createSnapshot(Path path)和Path createSnapshot(Path path, String snapshotName)。

删除快照

删除一个snapshottable目录的一个快照。删除操作也需要目录的所属人权限。

hdfs dfs -deleteSnapshot <Path> <snapshotName>

对应的API为FileSystem中的void deleteSnapshot(Path path, String snapshotName)。

重命名快照

重命名一个快照。也需要该目录的所属人权限。

hdfs dfs -renameSnapshot <Path> <oldName> <newName>

对应的API为FileSystem中的void renameSnapshot(Path path, String oldName, String newName)。

列出所有允许快照目录

列出所有当前用户有权限获取的,允许快照的目录。

hdfs lsSnapshottableDir

对应的API为DistributeFileSystem中的snapshottableDirectoryStatus[] getSnapshottableDirectoryListing()。

对比快照

对比两个快照。这个操作需要用户对两个快照目录同时具有读权限。

hdfs snapshotDiff <Path> <fromSnapshot> <toSnapshot>

对应API为DistributeFileSystem中的SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)。





相关内容