HDFS Snapshots HDFS Snapshots. 1 1. 概述... 1 1.1 Snapshottable目錄... 1 1.2 快照路徑... 1 2. 帶快照的更新... 1 3. 快照操作... 1 3.1 管理操作... 1 3.2 用戶操作... 1 1. 概述 HDFS快 ...
HDFS Snapshots
1. 概述
HDFS快照是只讀的,一個時間點文件系統的一個副本。快照可以是整個文件系統或者文件系統的子樹。快照通常用來備份,保護用戶錯誤和災難恢復。
HDFS快照的實現:
· 快照創建是瞬間的,花費是O(1)不包過inode lookup時間。
· 如果和快照相關的,在修改的時候會使用額外的記憶體:記憶體使用時O(M),M是修改的文件和目錄個數。
· Datanode中的block不會被覆制:快照只會記錄block list和文件大小。不會進行數據複製。
· 快照不會影響HDFS操作:修改被反轉再被順序記錄,這樣當前的數據還是和以前一樣訪問。快照的數據通過當前的數據然後使用記錄undo。
1.1 Snapshottable目錄
快照可以在任何目錄上,一旦目錄被設置了snapshottable。Snapshottable允許65536個併發快照。Snapshottable目錄個數沒有限制。管理員可以對任何目錄設置為snapshottable。如果快照在snapshottable目錄,在快照刪除前,目錄不能被刪除,也不能重命名。
snapshottable目錄是不能嵌套的。也就是說如果父目錄,或者子目錄已經設置了snapshottable目錄,那麼就不能再設置。
1.2 快照路徑
對於一個snapshottable目錄,路徑.snapshot用來訪問快照。假設/foo是是snapshottable目錄,/foo/bar是/foo中的文件,並且/foo有一個快照s0。/foo/.snapshot/s0/bar就是/foo/bar的快照副本。通常的API和CLI可以在.snapshot路徑上使用。比如:
· 列出所有snapshottable目錄下的所有快照:
hdfs dfs -ls /foo/.snapshot
·
列出快照s0的所有文件:
hdfs dfs -ls /foo/.snapshot/s0
·
從快照中複製文件:
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
2. 帶快照的更新
HDFS快照特性引入了一個新的保留地址用來和快照交互:.snapshot。當從老的HDFS版本不支持快照的,升級時如果有.snapshot那麼需要先刪除避免出現衝突。
3. 快照操作
3.1 管理操作
允許快照
允許對目錄創建快照,如果完成並且成功那麼目錄就會變成snapshottable。
hdfs dfsadmin -allowSnapshot <path>
參數:snapshottable目錄的地址。
禁止快照
禁止目錄創建快照。所有快照在禁用前必須刪除
hdfs dfsadmin -disallowSnapshot <path>
參數:snapshottable目錄的地址。
3.2 用戶操作
創建快照
在snapshottable目錄上創建快照。需要snapshottable目錄的owner許可權
hdfs dfs -createSnapshot <path> [<snapshotName>]
snapshotname預設是s'yyyyMMdd-HHmmss.SSS 比如s20130412-151029.033
刪除快照
從snapshottable目錄刪除快照。需要snapshottable 目錄owner許可權。
hdfs dfs -deleteSnapshot <path> <snapshotName>
重命名快照
快照重命名,需要snapshottable 目錄owner許可權。
hdfs dfs -renameSnapshot <path> <oldName> <newName>
獲取snapshottable目錄列表
列出所有snapshottable目錄
hdfs lsSnapshottableDir
獲取快照不通的報告
獲取2個快照的不同,需要2個快照目錄的所有讀許可權。
命令:hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
結果:
+ |
The file/directory has been created. |
- |
The file/directory has been deleted. |
M |
The file/directory has been modified. |
R |
The file/directory has been renamed. |
RENAME表示文件重命名但是還在snapshottable目錄下。一個文件或者目錄移動出了snapshottable目錄,那麼就被認為是刪除了。一個文件或者目錄移動到snapshottable目錄,就被認為是創建。
Snapshot差異報告不會爆炸相同操作的順序。比如如果目錄從/foo重命名為/foo2然後在/foo2創建了一個文件bar,那麼差異報告:
R. /foo -> /foo2
M. /foo/bar
在重命名後的目錄上的操作,報告是之前路徑的,比如上面的報告。