在hadoop第前幾個版本中是沒有快照功能的,2.x中是有這個特性的
Hadoop 2.x HDFS新特性
HDFS快照
HDFS快照
在2.x終於實現了快照
設置一個目錄為可快照:
hdfs dfsadmin -allowSnapshot <path>
取消目錄可快照:
hdfs dfsadmin -disallowSnapshot <path>
生成快照:
hdfs dfs -createSnapshot <path> [<snapshotName>]
刪除快照:
hdfs dfs -deleteSnapshot <path> <snapshotName>
快照位置
可快照目錄下的.snapshot子目錄
其它快照操作
列出所有可快照目錄:
hdfs lsSnapshottableDir
比較快照之間的差異:
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
詳細查考這個:http://www.cnblogs.com/nucdy/p/5684139.html
Hdfs的快照原理
Hdfs的快照(snapshot)是在某一時間點對指定文件系統拷貝,快照采用只讀模式,可以對重要數據進行恢復、防止用戶錯誤性的操作。
快照分兩種:
一種是:建立文件系統的索引,每次更新文件不會真正的改變文件,而是新開辟一個空間用來保存更改的文件,
一種是:拷貝所有的文件系統。Hdfs屬於前者。 Hdfs的快照的特征如下:
1. 快照的創建是瞬間的,代價為O(1),取決於子節點掃描文件目錄的時間。
2. 當且僅當做快照的文件目錄下有文件更新時才會占用小部分內存,占用內存的大小為
O(M),其中M為更改文件或者目錄的數量;
3. 新建快照的時候,Datanode中的block不會被復制,快照中只是記錄了文件塊的列表和
大小信息。
4. 快照不會影響正常的hdfs的操作。對做快照之后的數據進行的更改將會按照時間順序逆
序的記錄下來,用戶訪問的還是當前最新的數據,快照里的內容為快照創建的時間點時文件的內容減去當前文件的內容。
每個快照最高限額為65536個文件或者文件夾,在快照的子文件夾中不允許在創建新的快照。
注意,mv命令和del命令是不允許的,因為快照是只讀的
來源:http://wenku.baidu.com/link?url=Yy16EN-wHlyfiF4A4f9DYnxUlKyr-AuUBGwtIS-bu4FcvbIs_QNeWPD17eoUm72YW8TXv4p_V4g5V1i9D1IyZbmfM8qwyOva2W5qLEY3znO
hadoop snapshots 快照
HDFS 快照是文件系一個時間點的只讀的副本。快照可以是部分文件系統,或者整個文件系統。一些場景使用快照的場景是數據備份,防止用戶誤操作和災難恢復。
使用HDFS 快照是高效的:
- 快照創建是瞬間的:成本是0(1)排除查找信息節點的時間 。
- 額外的內存使用僅僅當對快照進行修改時產生:內存使用時0(M),M是修改文件/目錄的數量。
- 在datanode中的塊不會被拷貝:快照文件記錄這些塊列表和文件大小。不會產生數據拷貝。
- 快照不會對日常的HDFS操作產生不利的影響:修改被按反向時間排序記錄,這樣當前數據可以直接的訪問。快照數據是由當前數據減去修改數據計算出來的(t.dbdao.com)。
1.1 snapshottable目錄
快照可以產生在任何被設置為snapshottable的目錄中。一個snapshottable目錄可以同時容納65536個快照。snapshottable目錄沒有個數上限,管理員可以設置任意個snapshottable。如果一個snapshottable中存在快照,那么這個目錄在刪除所有快照之前,不能刪除或改名。
嵌套的snapshottable目錄在現在並不支持(日期:2015-11-02)。換句話說,如果一個目錄的父目錄/子目錄是一個snapshottable目錄的話,那么其不能設置為snapshottable。
1.2 快照 路徑
對於一個snapshottable目錄,”.snapshot”組件有利於訪問其快照。假設/foo是一個snapshottable目錄,/foo/bar是 /foo中的一個文件/目錄,/foo有一個快照s0,那么這個路徑
/foo/.snapshot/s0/bar
/foo/.snapshot/s0/bar
列出一個snapshottable目錄中所有的快照:關聯到快照副本/foo/bar。一般的API和CLI都可以在”.snapshot”路徑上工作。下面是一些例子
Shell
hdfs dfs -ls /foo/.snapshot
hdfs dfs-ls/foo/.snapshot
- 列出在快照s0中的文件:
Shell
hdfs dfs -ls /foo/.snapshot/s0
hdfs dfs-ls/foo/.snapshot/s0
- 從快照s0中拷貝文件:
Shell
hdfs dfs -cp -ptopax /foo/.snapshot/s0/bar /tmp
hdfs dfs-cp-ptopax/foo/.snapshot/s0/bar/tmp
注意這個例子使用了保存選項來保存時間戳,所有權,權限,ACLS和XAttrs
2 在有快照的時候升級HDFS版本
HDFS快照特性引用了一個新的保留路徑名,來進行快照交互:.snapshot。當HDFS從一個舊版本升級時,現存的路徑名稱.snapshot需要首先重命名或者刪除,來避免保留路徑的沖突。更多詳細類容,參考HDFS用戶指南升級部分(t.dbdao.com)。
3快照操作
3.1管理員操作
本節中描述的操作需要超級用戶權限
允許快照
允許一個快照目錄被創建。如果這個操作成功完成,這個目錄就變成snapshottable
- 命令:
Shell
hdfs dfsadmin -allowSnapshot <path>
hdfs dfsadmin-allowSnapshot<path>
- 參數:
path snapshottable目錄的路徑
禁止快照
禁止快照目錄創建。在靜止快照之前目錄中的所有快照必須刪除。
- 命令:
Shell
hdfs dfsadmin -disallowSnapshot <path>
hdfs dfsadmin-disallowSnapshot<path>
- 參數
path snapshottable目錄的路徑
也可以參考Hdfsadmin中相關JAVA API void disallowSnapshot(Path path)
3.2 用戶操作
本節介紹用戶操作。注意HDFS超級用戶,可以執行除了個人操作需要滿足的安全權限之外的所有操作(t.dbdao.com)。
創建快照
在snapshottable目錄中創建一個一個快照。這個操作需要擁有snapshottabl目錄所有者權限。
- 命令
Shell
hdfs dfs -createSnapshot <path> [<snapshotName>]
hdfs dfs-createSnapshot<path>[<snapshotName>]
- 參數:
path | snapshottable目錄的路徑 |
snapshotName | 快照的名稱,是一個可選參數。當其省略時,默認的名稱是使用時間戳”s’yyyyMMdd-HHmmss.SSSS”的格式,例如”s20130412-151029.033″ |
也可以參考文件系統中相關JAVA API Path createSanpshot(Path path)和Path createSnapshot(Path path,String snapshotName)。在這些方法中返回了快照路徑。
刪除快照
從一個snapshottable目錄中刪除快照。這個操作需要擁有snapshottabl目錄所有者權限(t.dbdao.com)。
- 命令
Shell
hdfs dfs -deleteSnapshot <path> <snapshotName>
hdfs dfs-deleteSnapshot<path><snapshotName>
- 參數:
path | snapshottable目錄的路徑 |
snapshotName | 快照名稱 |
重命名快照
重命名一個快照。這個操作需要擁有snapshottabl目錄所有者權限。
- 命令:
Shell
hdfs dfs -renameSnapshot <path> <oldName> <newName>
hdfs dfs-renameSnapshot<path><oldName><newName>
- 參數:
path | snapshottable目錄的路徑 |
oldName | 舊的快照名 |
newName | 新的快照名 |
也可以參考文件系統中相關JAVA API void renameSnapshot(Path path, String oldName, String newName)
獲得snapshottable目錄列表
獲得當前用戶有權限產生快照的所有snapshottabl目錄
- 命令:
Shell
hdfs lsSnapshottableDir
hdfs lsSnapshottableDir
- 參數:無
也可以參考分布式文件系統中相關JAVA API SnapshottableDirectoryStatus[] getSnapshottableDirectoryListing()
獲得 快照差異報告
在2個快照之間獲得差異。這個操作需要在2個快照中,所有文件/目錄的讀和訪問權限(t.dbdao.com)。
- 命令:
Shell
hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>
hdfs snapshotDiff<path><fromSnapshot><toSnapshot>
- 參數:
path | snapshottable目錄的路徑 |
fromSnapshot | 開始快照的名稱 |
toSnapshot | 結束快照的名稱 |
- 結果:
+ | 文件/目錄 被創建 |
_ | 文件/目錄 被刪除 |
M | 文件/目錄 被修改 |
R | 文件/目錄 被重命名 |
一個RENAME提示一個文件/目錄被重命名,但是仍然存在相同的snapshottabl目錄中。如果一個文件/目錄被重命名到snapshottabl目錄外,那么會打印為刪除。從snapshottabl目錄之外重命名進來的文件/目錄,被打印為新創建。
快照差異報告不能保證相同操作的順序。例如,如果我們將目錄”/foo”重命名為”/foo2″,然后增加一個新文件為”/foo2/bar”,這個差異報告將是:
R. /foo -> /foo2 M. /foo/bar
R./foo->/foo2 M./foo/bar
即,在一個目錄重命名下的文件/目錄 變更,在報告的時候,是使用原來未重命名之前的名稱。(例如上面的”/foo/bar”)
也可以參考分布式文件系統中相關JAVA API SnapshotDiffReport getSnapshotDiffReport(Path path, String fromSnapshot, String toSnapshot)
Hbase的基於快照的表修復
Hdfs的快照同樣適用於hbase表的恢復。在hbase的數據表目錄/hbase/data/default/(default為默認namespace空間)中新建快照,就會在該目錄下生成.snapshot的文件夾,里面放着針對該目錄的所有快照。
如果存在用戶誤刪hbase表
將快照中保存的數據表文件夾cp到/hbase/data/default下,然后執行如下命令,修復元數據即可。
注意,cp到/hbase/data/default目錄下的數據表文件夾的權限要修改成hbase:hbase。 否則修改元數據的命令會失敗。
上面是對整個hbase的namespace空間進行的快照備份,如果在某一個表目錄下建快照,那么這個表目錄就會變成只讀,在hbase shell中執行disable+drop <tablename>不會將表刪除,在建快照之后新增的表數據也不會丟失。
雖然數據不會丟失但是元數據會被drop命令刪除,還得用repair命令進行修復。
修復完之后,再enable這個表,就ok了。
source: http://www.thebigdata.cn/Hadoop/15618.html
另外練習的可以到這個網址:
hadoop snapshots 快照實驗