說明:由于近期正好在研究hadoop的快照機制。看官網上的文檔講的非常仔細。就順手翻譯了。也沒有去深究一些名詞的標準譯法,所以可能有些翻譯和使用方法不是非常正確,莫要介意~~
原文地址:(Apache hadoop的官方文檔)?https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html
1. 概述
快照snapshots是HDFS文件系統的僅僅讀的基于某時間點的拷貝,能夠針對某個文件夾,或者整個文件系統做快照。
快照比較常見的應用場景是數據備份,以防一些用戶錯誤或災難恢復。
快照的高效性實現:(1) 快照能夠即時創建。耗時僅為O(1)。
--excluding the inode lookup time
(2) 僅僅有當涉及到快照文件夾的改動被運行時。才會產生額外的內存消耗。
并且內存消耗為O(M)。當中M是被改動的文件或文件夾數。
(3) 創建快照時,block塊并不會被拷貝。
快照文件里僅僅記錄了block列表和文件大小,不會做不論什么數據拷貝。
(4) 快照不會對正常的HDFS操作有不論什么影響:創建快照以后發生的改動操作,被按操作時間的倒序(from newer to older)記錄下來。
所以當前的數據能被直接獲取,而快照點的數據。則通過在當前的數據基礎上減去運行過的操作來獲取。
-- 所以我理解時間越久的快照。要獲取就須要越長的時間。?
1.1 快照文件夾
我們能夠在不論什么被設置為snapshottable的文件夾上運行快照,對一個文件夾最多能夠創建65536個快照。管理員能夠把不論什么文件夾設置為snapshottable,沒有限制。
假設一個文件夾下已經存在快照,那么僅僅有當先刪除全部快照后才干對這個文件夾進行刪除和重命名等操作。
不同意嵌套的snapshottable文件夾。也就是說,假設一個文件夾被設置為snapshottable,那么它的父文件夾和子文件夾都不同意被設置為snapshottable。
1.2 快照路徑
快照被存放在一個被命名為.snapshot的文件夾中。比方/foo是一個snapshottable文件夾,/foo中有一個文件夾為/foo/bar,對/foo創建一個快照s0。那么?
就是/foo/bar文件夾相應的快照。能夠通過".snapshot"路徑直接訪問和操作快照數據。比如:/foo/.snapshot/s0/bar
- 列出一個文件夾的全部快照:
hdfs dfs -ls /foo/.snapshot
- 列出快照s0中的全部文件:
hdfs dfs -ls /foo/.snapshot/s0
- 從快照中拷貝文件:
hdfs dfs -cp /foo/.snapshot/s0/bar /tmp
2. 快照操作
2.1 快照管理
僅僅有集群的管理員才有權限進行例如以下操作。
同意快照
把一個文件夾設置為snapshottable,就是設置同意對一個文件夾創建快照。
hdfs dfsadmin -allowSnapshot <path>
相應的API為HdfsAdmin中的void allowSnapshot(Path path)。
禁止快照
把原本snapshottable的文件夾設置為禁止快照,不同意對該文件夾創建快照。在對一個文件夾設置禁止快照之前,要先刪除該文件夾的全部快照。
相應的API為HdfsAdmin中的void disallowSnapshot(Path path)。hdfs dfsadmin -disallowSnapshot <Path>
2.2 用戶操作
創建快照?
為一個文件夾創建快照,僅僅有文件夾的所屬人權限能為這個文件夾創建快照。hdfs dfs -createSnapshot <Path> [<snapshotName>]
snapshotName是要創建的快照名,假設未定義。默認取當前時間戳作為快照名。類似”"s20130412-151029.033“。
相應的API為FileSystem中的Path createSnapshot(Path path)和Path createSnapshot(Path path, String snapshotName)。
刪除快照
刪除一個snapshottable文件夾的一個快照。
刪除操作也須要文件夾的所屬人權限。
hdfs dfs -deleteSnapshot <Path> <snapshotName>
相應的API為FileSystem中的void deleteSnapshot(Path path, String snapshotName)。
重命名快照
重命名一個快照。
也須要該文件夾的所屬人權限。
hdfs dfs -renameSnapshot <Path> <oldName> <newName>
相應的API為FileSystem中的void renameSnapshot(Path path, String oldName, String newName)。
列出全部同意快照文件夾
列出全部當前用戶有權限獲取的。同意快照的文件夾。
hdfs lsSnapshottableDir
相應的API為DistributeFileSystem中的snapshottableDirectoryStatus[] getSnapshottableDirectoryListing()。
對照快照
對照兩個快照。
這個操作須要用戶對兩個快照文件夾同一時候具有讀權限。
hdfs snapshotDiff <Path> <fromSnapshot> <toSnapshot>
相應API為DistributeFileSystem中的SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)。