HDFS Snapshot[官网整理]
【HDFS Snapshot(2.2+)】
HDFS Snapshot是文件系统在某一时间点的只读的备份,Snapshot可以针对文件系统的子树或者整个文件系统。Snapshot的通常用法是做数据backup,以避免用户错误和灾难恢复。
HDFS Snapshot实现是高效的:
1、Snapshot的创建是瞬间完成:除了节点遍历耗时之外,其创建的开销为O(1)。
2、Snapshot后数据发生更改时,将会消耗额外的内存(记录修改操作),内存使用量为O(M),其中M为更改的文件或者目录的个数。
3、Datanodes上的Blocks并不会发生Copy:snapshot文件记录了有关的block列表和文件大小,没有实际数据的Copy。(并不是计算机科学中的Full snapshot)
4、Snapshot不会影响正常的HDFS操作:修改操作按照时间倒叙的方式记录,因此当前数据可以直接访问。snapshot数据由当前数据减去已经修改的部分。snapshot Data = current data - modification。访问数据时会经过snapshot判定(可以认为snapshot在内存中维护了一份目录子树,Namenodes),对于修改记录中没有涉及到的文件或者目录将可以直接访问,否则从snapshot子树中获取。
一、Snapshottable 目录
Snapshot可以在任何snapshottable目录上进行。一个snapshottable目录可以容忍65536个snapshots。文件系统对snapshottable目录个数没有上限。管理员可以将任何目录设置为snapshottable。 如果一个snapshottable目录下存在snapshots(数据),这个目录将不能被删除或者重命名,直到所有的snapshots被删除。
目前不允许snapshottable目录的嵌套,即如果一个目录的父目录或者子目录是snapshottable,那么不能将它设置为snapshottable。
二、 Snapshot 路径
对于一个snapshottable目录,路径部分“.snapshot”用来访问其snapshots。例如“/foo”是一个snapshottable目录,“/foo/bar”是此目录下的一个文件或者目录,且“/foo”已经有一个名为s0的snapshot,那么路径“/foo/.snapshot/bar”即是“/foo/bar”的snapshot复本。如下为可参考例子:
1、列出“/foor”目录下所有的snapshots:
“hdfs dfs -ls /foo/.snapshot”
2、列出名为s0的snapshot中的文件:
“hdfs dfs -ls /foo/.snapshot/s0”
3、从s0中复制文件
“hdfs dfs -cp /foo/.snapshot/s0/bar /tmp”
注意,在HDFS中“.snapshot”作为一个保留字,用户将不能创建“.snapshot”名称的目录或者文件。
三、snapshot操作
1、开启snapshot:将一个目录设置为snapshottable
“hdfs dfsadmin -allowSnapshot <path>”
2、关闭snapshots:此目录下的所有snapshots需要首先删除,才能执行disabllow指令。
“hdfs dfsadmin -disallowSnapshot <path>”
3、创建snapshot:对一个snapshottable目录创建snapshot。
“hdfs dfs -createSnapshot <path> [snapshotName]”
创建snapshot时可以指定名称,这是可选参数;如果没有指定snapshotName,系统将会根据timestamp按照格式“'s' yyyyMMdd-HHmmss.SSS”,例如“s20130412-151029.003”。我们也可以使用HDFS Client API来创建snapshot:FileSystem#createSnapshot(path,snapshotName)。
4、删除snapshots:从一个snapshottable目录下删除snapshots。
“hdfs dfs -deleteSnapshot <path> <snapshotName>”
我们可以首先使用“hdfs dfs -ls <path>/.snapshot”来查看目录下所有snapshots的列表,然后删除。
5、重命名snapshots:修改snapshot的名称
“hdfs dfs -renameSnapshot <path> <oldName> <newName>”
6、列举所有的snapshottable目录
“hdfs lsSnapshottableDir”
7、获取snapshots差别报告:获取两个snapshots的不同。
“hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>”
上述所有snapshot操作,均可以通过FileSystem API操作。snapshots并不会创建实际数据的Copy,不过这些snapshots以及snapshot之后的变更操作将会添加到Namenode的metadata中,对于datanodes并不知道snapshots的任何细节,事实上snapshots操作也不会和Datanodes交互,即一个文件、目录是否有snapshots,Datanodes并不需要知道,创建snapshot也不需要Datanodes做任何额外的操作(包括Block迁移),不过文件的修改操作均会有Namenode判定,当一个目录有snapshot时不允许删除。