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>
表示待對比的快照。