1.簡介java
Snapshots即快照的意思,做用於表上。在對於表作快照的時候不會形成文件的拷貝,如不會對HFile文件進行拷貝而是以連接的方式連接到元表的HFile上。能夠說它是一種元數據的集合,能夠快速的恢復到表至快照指定的狀態從而迅速的數據修復(會丟失快照以後的數據)如用戶誤刪除表等操做中恢復。也能夠將數據拷貝到不一樣的集羣進行數據的備份。web
2.準備apache
在測試環境上準備源表:網絡
hbase(main):005:0> scan 'mytable' ROW COLUMN+CELL row1 column=f1:a, timestamp=1470208281649, value=1 row2 column=f1:a, timestamp=1470208287371, value=2 row3 column=f1:a, timestamp=1470208295512, value=3 row4 column=f1:a, timestamp=1470208301149, value=4 row5 column=f1:a, timestamp=1470208305778, value=5 row6 column=f1:a, timestamp=1470209308099, value=6 6 row(s) in 0.1100 seconds
3.操做:app
a.建立快照: oop
hbase(main):006:0> snapshot 'mytable','mysnapshot' 0 row(s) in 0.3840 seconds
建立完畢後再web頁面咱們能夠看到快照的信息,顯示了多少hfile包含於這個快照,這些hfile是否被歸檔(當發生分裂,compaction或者drop表操做的時候有可能會在源表hdfs目錄中刪除這測試
些引用的hfile,可是爲了維護快照的信息這些被刪除的hfile會被歸檔到指定目錄,這裏看到100%shared with the source table 表明這些hfile尚未沒刪除。)優化
其會在以下hdfs路徑下建立快照的引用信息:ui
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/.hbase-snapshot/mysnapshot Found 2 items -rw-r--r-- 1 hadoop supergroup 32 2016-08-03 03:43 /hbase/.hbase-snapshot/mysnapshot/.snapshotinfo// 這裏記錄了當前快照的元信息 -rw-r--r-- 1 hadoop supergroup 464 2016-08-03 03:43 /hbase/.hbase-snapshot/mysnapshot/data.manifest// 這裏記錄了源表的元信息,region分裂信息,以及引用目標hfile信息
注意:如今大部分網絡上的分享信息都是說建立一個空文件來連接到源表的hfile文件上,在https://issues.apache.org/jira/browse/HBASE-7987中優化這樣的處理,避免了大量的空的連接文件對於hdfs的衝擊。
這裏咱們展現一下具體的data.manifest文件信息spa
16/08/03 04:21:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ? defaultmytable IS_METAfalse? f1 ATA_BLOCK_ENCODINGNONE BLOOMFILTERROW REPLICATION_SCOPE0 COMPRESSIONNONE VERSIONS1 TTL 2147483647 MIN_VERSIONS0 EEP_DELETED_CELLSFALSE BLOCKSIZE65536 IN_MEMORYfalse BLOCKCACHEtrueX?????*// 這一部分保存了源表的元信息 defaultmytablerow3"(08+ f1% 420c04ce57eb4634bf2efefb56aa0b15X?????* defaultmytable"row3(08+ f1% 29a0b0870ce740dba0be8ba24c3fa34e// 這一部分保存了region的切分信息和當前快照因此來的源表的hfile信息【一般創建快照的時候都須要flush表】
b.restore 快照:
以下咱們將mytable這個源表刪除:
hbase(main):002:0> put 'mytable','row7','f1:a',7 // 插入一條數據以此來檢測當restore後數據是否恢復的原來的狀態 0 row(s) in 0.0940 seconds hbase(main):003:0> flush 'mytable' 0 row(s) in 0.5350 seconds hbase(main):004:0> disable 'mytable' 0 row(s) in 2.4120 seconds hbase(main):005:0> drop 'mytable' 0 row(s) in 1.2890 seconds
此時源表被刪除,源表的hdfs文件夾也被刪除了:
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/data/default/mytable 16/08/03 04:51:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ls: `/hbase/data/default/mytable': No such file or directory
這個時候快照manifest中引用的源表hfile會被歸檔到,只要原來的文件有被刪除的狀況,那麼快照所引用的hfile文件都會歸檔到archive的對應表目錄中。
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/archive/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1 16/08/03 04:57:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items -rw-r--r-- 1 hadoop supergroup 1107 2016-08-03 04:50 /hbase/archive/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1/420c04ce57eb4634bf2efefb56aa0b15 [hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/archive/data/default/mytable/d2d35f61fae1de22492b0c6d9d305cfe/f1 16/08/03 04:57:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items -rw-r--r-- 1 hadoop supergroup 1045 2016-08-03 04:50 /hbase/archive/data/default/mytable/d2d35f61fae1de22492b0c6d9d305cfe/f1/29a0b0870ce740dba0be8ba24c3fa34e [hadoop@xufeng-3 ~]$
執行restore,咱們能夠看到表數據被恢復,且數據
hbase(main):005:0> drop 'mytable' 0 row(s) in 1.2890 seconds hbase(main):006:0> restore_snapshot 'mysnapshot' 0 row(s) in 0.8470 seconds hbase(main):007:0> list TABLE mytable 1 row(s) in 0.0190 seconds => ["mytable"] hbase(main):008:0> scan 'mytable' ROW COLUMN+CELL row1 column=f1:a, timestamp=1470208281649, value=1 row2 column=f1:a, timestamp=1470208287371, value=2 row3 column=f1:a, timestamp=1470208295512, value=3 row4 column=f1:a, timestamp=1470208301149, value=4 row5 column=f1:a, timestamp=1470208305778, value=5 row6 column=f1:a, timestamp=1470209308099, value=6 6 row(s) in 0.0430 seconds hbase(main):009:0>
咱們接着在被恢復表的hdfs目錄結構,能夠看到這兩個hfile的size爲0,說明他是對achive中歸檔hfile的引用。
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1 Found 1 items -rw-r--r-- 1 hadoop supergroup 0 2016-08-03 05:14 /hbase/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1/mytable=49b61de11f43344b8bebfed0db0605b4-420c04ce57eb4634bf2efefb56aa0b15 [hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/data/default/mytable/d2d35f61fae1de22492b0c6d9d305cfe/f1 Found 1 items -rw-r--r-- 1 hadoop supergroup 0 2016-08-03 05:14 /hbase/data/default/mytable/d2d35f61fae1de22492b0c6d9d305cfe/f1/mytable=d2d35f61fae1de22492b0c6d9d305cfe-29a0b0870ce740dba0be8ba24c3fa34e
當咱們再次插入數據並flush的時,能夠看到新被flush的hfile是實際的hfile,大小不爲0,在achive中歸檔的hfile文件直到所對應的快照被刪除且當沒有沒有表引用它纔會被按期刪除。
hbase(main):009:0> put 'mytable','row7','f1:a',7 0 row(s) in 0.0180 seconds hbase(main):010:0> Display all 487 possibilities? (y or n) hbase(main):010:0> flush 'mytable' 0 row(s) in 0.3520 seconds
-rw-r--r-- 1 hadoop supergroup 1014 2016-08-03 05:23 /hbase/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1/7b6d4c0556c84224a8f8f1da10b5fee4 -rw-r--r-- 1 hadoop supergroup 0 2016-08-03 05:14 /hbase/data/default/mytable/49b61de11f43344b8bebfed0db0605b4/f1/mytable=49b61de11f43344b8bebfed0db0605b4-420c04ce57eb4634bf2efefb56aa0b15
c.從快照中克隆一張表
hbase(main):012:0> clone_snapshot 'mysnapshot','myclonetable' 0 row(s) in 2.5610 seconds hbase(main):013:0> scan 'myclonetable' ROW COLUMN+CELL row1 column=f1:a, timestamp=1470208281649, value=1 row2 column=f1:a, timestamp=1470208287371, value=2 row3 column=f1:a, timestamp=1470208295512, value=3 row4 column=f1:a, timestamp=1470208301149, value=4 row5 column=f1:a, timestamp=1470208305778, value=5 row6 column=f1:a, timestamp=1470209308099, value=6 6 row(s) in 0.2060 seconds
再來看一下其表hdfs目錄:能夠看到其hfile也是對於快照歸檔文件的引用,大小爲0,同時其具備不一樣的表名,不一樣的region名稱。
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/data/default/myclonetable/660358521754384ce0d5e2e1a00b7f3e/f1 Found 1 items -rw-r--r-- 1 hadoop supergroup 0 2016-08-03 05:27 /hbase/data/default/myclonetable/660358521754384ce0d5e2e1a00b7f3e/f1/mytable=d2d35f61fae1de22492b0c6d9d305cfe-29a0b0870ce740dba0be8ba24c3fa34e [hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/data/default/myclonetable/93f80e96f83e193caf35752a84cf6492/f1 Found 1 items -rw-r--r-- 1 hadoop supergroup 0 2016-08-03 05:27 /hbase/data/default/myclonetable/93f80e96f83e193caf35752a84cf6492/f1/mytable=49b61de11f43344b8bebfed0db0605b4-420c04ce57eb4634bf2efefb56aa0b15
注意:clone與restore快照的區別經過上述實踐可知:restore恢復快照對應的源表的狀態,其表名,region都一致。而clone是執行表名從新建立了新表,除了表名連region名稱也不一樣,徹底是一張新表。
他們共同點是都引用了archive中快照歸檔的hflie文件。
d.刪除快照
hbase(main):015:0> delete_snapshot 'mysnapshot' 0 row(s) in 0.1580 seconds
刪除只有快照目錄被刪除可是archive目錄因爲被其餘表引用着並不會被刪除:
[hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/.hbase-snapshot/mysnapshot ls: `/hbase/.hbase-snapshot/mysnapshot': No such file or directory [hadoop@xufeng-3 ~]$ hadoop fs -ls /hbase/archive/data/default/mytable Found 2 items drwxr-xr-x - hadoop supergroup 0 2016-08-03 04:55 /hbase/archive/data/default/mytable/49b61de11f43344b8bebfed0db0605b4 drwxr-xr-x - hadoop supergroup 0 2016-08-03 04:55 /hbase/archive/data/default/mytable/d2d35f61fae1de22492b0c6d9d305cfe [hadoop@xufeng-3 ~]$
4.原理簡述
綜上對於快照的實踐咱們能夠大概總結一下快照的通常原理。
a.建立快照:
如前所述,在快照的data.manifest文件中寫明瞭快照指向那些hflie
b. 源表hfile文件變更(發生split、compact等),元hfile文件會被拷貝到archive歸檔目錄中去
c.restore
當對某個表進行restore時,此表在快照時間點以後建立的HFile會被刪除並被歸檔(有可能HF5之上也有快照引用),而後會經過一個空文件link到以前被歸檔的HF4文件上從而恢復了表數據。
d.clone
克隆的表是一個獨立的新表有本身的hdfs路徑,初始化的時候內部也都是空文件指向了源表的hfile或者被歸檔的hfile。
5.應用場景及缺陷:
略。