hdfs snapshot 快照的应用与操作命令的介绍

一:HDFSSnapShot的介绍

Hadoop从2.1.0版开始提供了HDFS SnapShot的功能
一个snapshot(快照)是一个全部文件系统、或者某个目录在某一时刻的镜像。快照在下面场景下是非常有用:

二:场景

防止用户的错误操作
管理员可以通过以滚动的方式周期性设置一个只读的快照,这样就可以在文件系统上有若干份只读快照。如果用户意外地删除了一个文件,就可以使用包含该文件的最新只读快照来进行回复。

备份
管理员可以根据需求来备份整个文件系统,一个目录或者单一一个文件。管理员设置一个只读快照,并使用这个快照作为整个全量备份的开始点。增量备份可以通过比较两个快照的差异来产生。

试验/测试:
一个用户当想要在数据集上测试一个应用程序。一般情况下,如果不做该数据集的全量拷贝,测试应用程序会覆盖/损坏原来的生产数据集,这是非常危险的。
管理员可以为用户设置一个生产数据集的快照(Read write)用于用户测试使用。在快照上的改变不会影响原有数据集。

灾难恢复
只读快照可以被用于创建一个一致的时间点镜像用于拷贝到远程站点作灾备冗余。
通过下面命令对某一个路径(根目录/,某一目录或者文件)开启快照功能,那么该目录就成为了一个snapshottable的目录。

snapshottable下存储的snapshots 最多为65535个,保存在该目录的.snapshot下。

hdfs dfsadmin -allowSnapshot /user/spark
Allowing snaphot on /user/spark succeeded
下面创建一个snapshot,命令格式为hdfs dfs -createSnapsshot [snapshot names]

hdfs dfs -createSnapshot /user/spark s0
Created snapshot /user/spark/.snapshot/s0

该快照会被立即创建出来,创建动作仅仅是在目录对应的Inode上加个快照的标签,因为此时快照目录里不包含任何实际数据。不同的快照间采用硬链接的方式,引用相同的数据块,所以也不会涉及到数据块的拷贝操作。而对文件的删除和追加,快照中的块将会的指向所作的修改的块,所以也不会对读写性能有影响,但是会占用namenode一定的额外内存来存放快照中被修改的文件和目录的元信息。

HDFS快照是文件系统的只读时间点副本。 可以对文件系统的子树或整个文件系统进行快照。 快照的一些常见用例是数据备份,防止用户错误和灾难恢复。
HDFS快照的实现是高效的:

快照创建是即时的:成本是O(1),不包括inode查找时间。
仅当对快照进行修改时才使用附加内存:内存使用为O(M),其中M是修改的文件/目录的数量。
不复制datanode中的块:快照文件记录块列表和文件大小。 没有数据复制。
快照不会对常规HDFS操作产生负面影响:修改会按相反的时间顺序记录,以便可以直接访问当前数据。 通过从当前数据中减去修改来计算快照数据。

Snapshottable目录

一旦目录设置为可快照,就可以对任何目录进行快照。 snaphottable目录能够容纳65,536个同步快照。可快照目录的数量没有限制。 管理员可以将任何目录设置为可快照。如果快照目录中有快照,则在删除所有快照之前,不能删除或重命名目录。
当前不允许嵌套snaphottable目录。 换句话说,如果一个目录的祖先/后代是一个snaphottable目录,则不能将其设置为snaphottable。

三:操作参数

快照路径

对于快照目录,路径组件“.snapshot”用于访问其快照。 假设/ foo是snaphottable目录,/ foo / bar是/ foo中的文件/目录,而/ foo有一个快照s0。 然后,路径

/foo/.snapshot/s0/bar

指的是/ foo / bar的快照副本。 通常的API和CLI可以使用“.snapshot”路径。 以下是一些示例。
列出snaphottable目录下的所有快照:

hdfs dfs -ls /foo/.snapshot

列出快照s0中的文件:

hdfs dfs -ls /foo/.snapshot/s0

从快照s0复制文件:

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

请注意,此示例使用保留选项来保留时间戳,所有权,权限,ACL和XAttrs。
使用快照升级到HDFS版本

HDFS快照功能引入了用于与快照交互的新保留路径名:.snapshot。 从旧版本的HDFS升级时,名为.snapshot的现有路径需要首先重命名或删除,以避免与保留路径冲突。 有关详细信息,请参阅HDFS用户指南中的升级部分。
快照操作

管理员操作

注意:本节中描述的操作需要超级用户权限。
允许快照

允许创建目录的快照。 如果操作成功完成,则目录变为可快照。
命令

hdfs dfsadmin -allowSnapshot

参数

path:snaphottable目录的路径。

不可快照

不允许创建目录的快照。 在禁用快照之前,必须删除目录的所有快照。
命令

hdfs dfsadmin -disallowSnapshot

参数

path:snaphottable目录的路径。

用户操作
注意: HDFS超级用户可以执行所有操作而不满足各个操作中的权限要求。
创建快照

创建快照目录的快照。 此操作需要snaphottable目录的所有者特权。
命令

hdfs dfs -createSnapshot []

参数

path:snaphottable目录的路径。
snapshotName:快照名称,它是一个可选参数。 当省略时,使用格式为“’s’yyyyMMdd-HHmmss.SSS”的时间戳生成默认名称,例如。 “s20130412-151029.033”。

另请参见文件系统中相应的Java API路径createSnapshot(路径路径)和路径createSnapshot(路径路径,字符串snapshotName)。 在这些方法中返回快照路径。
删除快照

从快照目录中删除快照。 此操作需要snaphottable目录的所有者特权。
命令

hdfs dfs -deleteSnapshot

参数

path:snaphottable目录的路径。
snapshotName:快照名。

另请参见文件系统中相应的Java API void deleteSnapshot(Path path,String snapshotName)。
重命名快照

重命名快照。 此操作需要snaphottable目录的所有者特权。
命令

hdfs dfs -renameSnapshot

参数

path:snaphottable目录的路径。
oldName:原快照名称。
newName:新快照名称。

获取当前用户有权拍摄快照的所有快照表目录。
命令

hdfs lsSnapshottableDir

获取快照差异报告
获取两个快照之间的差异。 此操作需要两个快照中的所有文件/目录的读访问权限。
命令

hdfs snapshotDiff

参数

path:snaphottable目录的路径。
fromSnapshot:原快照。
toSnapshot:要对比的快照。

结果

  • 文件或者目录被创建。
    – 文件或者目录被删除。
    M 文件或者目录已修改。
    R 文件/目录已重命名。

RENAME条目表示文件/目录已重命名,但仍位于相同的snaphottable目录下。 如果将文件/目录重命名为snapshottble目录之外,则将其报告为已删除。 从snapshottble目录之外重命名的文件/目录将报告为新创建。
快照差异报告不保证相同的操作顺序。 例如,如果我们将目录“/ foo”重命名为“/ foo2”,然后将新数据附加到文件“/ foo2 / bar”,差异报告将是:

R. /foo -> /foo2
M. /foo/bar

即,使用重命名之前的原始路径(上例中的“/ foo / bar”)报告重命名的目录下的文件/目录的更改。