HDFS快照(Snapshots)是文件系统在某一时刻的只读副本。快照可以在文件系统的一个分支或者整个文件系统上生成。快照常用来备份数据,防止错误性的操作。本文为您介绍HDFS快照的目录、路径以及相关的快照操作。
背景信息
HDFS快照的特征如下:
快照的创建是瞬时的:时间复杂度为O(1),不包括INode查找时间。
仅当修改快照相关的数据时才会使用额外的内存:内存使用复杂度为O(M),其中M是修改的文件或目录的数量。
DataNode中的数据块不会被复制:快照文件仅记录块列表和文件大小,不涉及数据复制。
快照不会对常规的HDFS操作造成不利影响:修改操作按照时间倒序记录,以便可以直接访问当前最新的数据。快照数据是通过当前数据减去修改的部分计算得到的。
快照目录
当目录被设置为允许快照时才会生成快照。一个快照目录可以同时容纳65536个快照。快照目录的数量是没有限制的。管理员可以将任何目录设置为快照。如果一个目录中有快照,则在删除所有快照之前,既不能删除也不能重命名该目录。
不允许级联的快照目录。如果一个目录的父目录或者子目录是快照目录,则不能将该目录设置为快照。
快照路径
对于一个快照目录,访问时需要添加/.snapshot后缀。例如,如果/foo是一个快照目录,/foo/bar是/foo下的文件或者目录,/foo有一个快照s0,则/foo/.snapshot/s0/bar是/foo/bar的快照副本。常用的API和CLI可以通过在.snapshot目录下完成,操作快照的命令示例如下:
列出快照目录下的所有快照
hdfs dfs -ls /foo/.snapshot
列出快照s0中的所有文件
hdfs dfs -ls /foo/.snapshot/s0
从快照s0中复制文件
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
说明该示例使用
-ptopax
参数来保留时间戳、所有权、权限、ACL和XAttrs。
快照操作
管理员操作
说明以下管理员操作需要超级用户权限。
允许快照
允许创建目录的快照。如果操作成功完成,该目录将变为可快照目录。
hdfs dfsadmin -allowSnapshot <path>
禁止快照
禁止创建目录的快照。在禁止快照之前,必须删除该目录的所有快照。
hdfs dfsadmin -disallowSnapshot <path>
用户操作
说明HDFS超级用户可以执行以下所有操作。
创建快照
创建目录的快照。该操作需要快照目录的所有者权限。
hdfs dfs -createSnapshot <path> [snapshotName]
说明本文代码示例中的
[snapshotName]
表示快照名称,是一个可选参数。当其省略时,默认的名称是使用时间戳syyyyMMdd-HHmmss.SSSS的格式表示,例如,s20130412-151029.033。删除快照
从快照目录中删除快照。该操作需要快照目录的所有者权限。
hdfs dfs -deleteSnapshot <path> <snapshotName>
重命名快照
重命名一个快照。该操作需要快照目录的所有者权限。
hdfs dfs -renameSnapshot <path> <oldName> <newName>
说明本文代码示例中的
<oldName>
表示原快照名称,<newName>
表示新快照名称。获取快照目录列表
获取当前用户拥有快照权限的所有快照目录。
hdfs lsSnapshottableDir
获取快照区别报告
获取两个快照之间的区别。该操作需要快照内所有文件或目录的读权限。
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
说明本文代码示例中的
<fromSnapshot>
表示原快照,<toSnapshot>
表示待对比的快照。