HDFS快照是文件系统的只读的实时的拷贝,可以是文件系统的一部分或者整个文件系统。快照的一些通用场景是数据备份,对用户错误的保护和灾难恢复。HDFS的快照实现是高效的:
- 快照的创建时瞬间完成的,排除查找inode的时间,需要花费O(1),即常数时间。
- 只有执行与快照相关的修改时才需要额外的内存,内存开销为O(M),M为修改的文件或者目录的数量。
- DataNodes中的块不会被复制,快照文件只记录块列表和文件的大小,没有数据的复制。
- 快照对常规HDFS操作没有有害影响,修改按时间逆序记录这样当前数据可以直接被访问(因为当前数据排在最前面,逆序)。快照数据通过从当前数据中减去修改来计算。
只要目录被设置为使用快照,快照就可以作用在目录上,一个启用快照的目录能够同时容纳65536个快照,对于能够启用快照的目录数量不做限制,管理员或许会将每个目录设置为启用快照。如果在启用快照的目录中存在快照,该目录在所有的快照删除之前既不可以被删除也不可以重命名。嵌套启用快照的目录目前是不支持的。换句话说如果一个目录的祖先或者后代是启用快照的目录,那么该目录是不能设置为启用快照的。
对于启用快照的目录,路径中.snapshot用于访问它的快照。假设/foo是快照目录,/foo/bar是/foo中的一个文件或者目录,/foo有一个快照s0,那么路径/foo/.snapshot/s0/bar引用/foo/bar的快照。通常使用的HDFS API和CLI都可以使用.snapshot路径访问快照,例如:
hdfs dfs -ls /foo/.snapsh