概述 HDFS快照是文件系統的只讀時間點副本。 可以對文件系統的子樹或整個文件系統進行快照。 快照的一些常見用例是數據備份,防止用戶錯誤和災難恢復。HDFS快照的實現是高效的: 快照創建是即時的:成本是O(1),不包括inode查找時間。 僅當對快照進行修改時才使用附加記憶體:記憶體使用為O(M),其中 ...
概述
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>
參數
path:snaphottable目錄的路徑。
另請參閱HdfsAdmin中的相應Java API void allowSnapshot(路徑路徑)。
不可快照
不允許創建目錄的快照。 在禁用快照之前,必須刪除目錄的所有快照。
命令
hdfs dfsadmin -disallowSnapshot <path>
參數
path:snaphottable目錄的路徑。
另請參閱HdfsAdmin中的相應Java API void disallowSnapshot(路徑路徑)。
用戶操作
註意: HDFS超級用戶可以執行所有操作而不滿足各個操作中的許可權要求。
創建快照
創建快照目錄的快照。 此操作需要snaphottable目錄的所有者特權。
命令
hdfs dfs -createSnapshot <path> [<snapshotName>]
參數
path:snaphottable目錄的路徑。
snapshotName:快照名稱,它是一個可選參數。 當省略時,使用格式為“’s’yyyyMMdd-HHmmss.SSS”的時間戳生成預設名稱,例如。 “s20130412-151029.033”。
另請參見文件系統中相應的Java API路徑createSnapshot(路徑路徑)和路徑createSnapshot(路徑路徑,字元串snapshotName)。 在這些方法中返回快照路徑。
刪除快照
從快照目錄中刪除快照。 此操作需要snaphottable目錄的所有者特權。
命令
hdfs dfs -deleteSnapshot <path> <snapshotName>
參數
path:snaphottable目錄的路徑。
snapshotName:快照名。
另請參見文件系統中相應的Java API void deleteSnapshot(Path path,String snapshotName)。
重命名快照
重命名快照。 此操作需要snaphottable目錄的所有者特權。
命令
hdfs dfs -renameSnapshot <path> <oldName> <newName>
參數
path:snaphottable目錄的路徑。
oldName:原快照名稱。
newName:新快照名稱。
另請參見FileSystem中對應的Java API void renameSnapshot(Path path,String oldName,String newName)。
獲取Snapshottable目錄列表
獲取當前用戶有權拍攝快照的所有快照表目錄。
命令
hdfs lsSnapshottableDir
另請參見DistributedFileSystem中的相應Java API SnapshottableDirectoryStatus [] getSnapshottableDirectoryListing()。
獲取快照差異報告
獲取兩個快照之間的差異。 此操作需要兩個快照中的所有文件/目錄的讀訪問許可權。
命令
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
參數
path:snaphottable目錄的路徑。
fromSnapshot:原快照。
toSnapshot:要對比的快照。
結果
+ 文件或者目錄被創建。
– 文件或者目錄被刪除。
M 文件或者目錄已修改。
R 文件/目錄已重命名。
RENAME條目表示文件/目錄已重命名,但仍位於相同的snaphottable目錄下。 如果將文件/目錄重命名為snapshottble目錄之外,則將其報告為已刪除。 從snapshottble目錄之外重命名的文件/目錄將報告為新創建。
快照差異報告不保證相同的操作順序。 例如,如果我們將目錄“/ foo”重命名為“/ foo2”,然後將新數據附加到文件“/ foo2 / bar”,差異報告將是:
R. /foo -> /foo2
M. /foo/bar
即,使用重命名之前的原始路徑(上例中的“/ foo / bar”)報告重命名的目錄下的文件/目錄的更改。
另請參見DistributedFileSystem中的相應Java API SnapshotDiffReport getSnapshotDiffReport(Path path,String fromSnapshot,String toSnapshot)。
轉載:https://www.vastyun.com/note_hadoop/300.html