HBase Snapshot簡介


一、簡介

HBase 從0.95開始引入了Snapshot,可以對table進行Snapshot,也可以Restore到Snapshot。Snapshot可以在線做,也可以離線做。Snapshot的實現不涉及到table實際數據的拷貝,僅僅拷貝一些元數據,比如組成table的region info,表的descriptor,還有表對應的HFile的文件的引用。

Hbase snapshot功能讓你對表進行快照而不對regionserver 產生太多影響。快照,克隆 和恢復操作不涉及數據拷貝。而且,將快照導出到其他集群也不會對regionserver有影響。

0.94之前的版本,備份或克隆的唯一方法就是利用 Copytable/ExportTable , 或在禁用表后復制HDFS中的所有hfiles。這些方法的缺點是你會降低regionserver的性能,或者你需要禁用表。那意味着不能讀寫,這在生產環境通常是不可接受的。

首先在配置項中打開snapshot

<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>

創建一個snapshot
無論表是否可用,你都可以做快照。Snapshot操作不涉及到數據復制。

$ ./bin/hbase shell
hbase> snapshot 'myTable', 'myTableSnapshot-122112'

默認的行為是在snapshot之前刷一遍內存中的數據。這意味着內存中的數據也包括在snapshot之中。大多數情況中,這是我們所希望的。然而,如果你的配置可以忍受內存中的數據沒有刷進snapshot,你可以使用SKIP_FLUSH 選項來關閉。

沒有辦法確定或預測一個非常規並發的插入,更新將包括在給定的快照中,是否啟用刷新。快照只是在時間窗口中的表的表示。

快照操作到達每個區域服務器所需的時間從幾秒鍾到一分鍾不等,取決於資源負載和硬件或網絡的速度,以及其他因素。也沒有辦法知道一個給定的插入或更新是在內存中還是被刷新。

列出snapshot

$ ./bin/hbase shell
hbase> list_snapshots

刪除snapshot

$ ./bin/hbase shell
hbase> delete_snapshot 'myTableSnapshot-122112'

從snapshot 克隆一個表

從snapshot你可以創建一張數據與做snapshot時一樣的新表。克隆操作,不涉及數據拷貝,修改克隆表也不影響snapshot和原始表。

$ ./bin/hbase shell
hbase> clone_snapshot 'myTableSnapshot-122112', 'myNewTestTable'

恢復一張表

恢復操作需要表離線不可用,恢復操作將讓表回到snapshot時的狀態,同時改變數據和schema,如果必要的話。

$ ./bin/hbase shell
hbase> disable 'myTable'
hbase> restore_snapshot 'myTableSnapshot-122112'

輸出到其他集群

$ bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase -mappers 16

與其它集群的導出或導入

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \
    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \
    -copy-to hdfs://srv1:50070/hbase \

用來改表名

hbase> disable 'tableName'
hbase> snapshot 'tableName', 'tableSnapshot'
hbase> clone_snapshot 'tableSnapshot', 'newTableName'
hbase> delete_snapshot 'tableSnapshot'
hbase> drop 'tableName'

二、原理解析

Snapshot之所以能在常數時間內完成,是因為它只是一組元數據(MetaData)的集合。Snapshot的操作都不需要復制任何業務數據。
首先我們要理解,HBase的底層存儲文件HFile是什么,以及是怎么被生成的、怎么被刪除的(或者叫生命周期)。其次就不難理解Snapshot為什么不需要復制業務數據了。

1. HFile是什么

HBase是一個Key-Value數據庫,其基本數據操作(如Put、Delete等)最后都化歸為Key-Value對,存儲在HDFS的一個個文件(HFile)中:
image

注意上圖綠色的Key字段中,最后有個1 Byte的Key Type域,即是用來區分Put和Delete的。

另外更需注意的一點是,HBase的Delete操作並不是立即定位到目標數據將其刪除或者做個刪除標記,因為HDFS不支持這種隨機寫。Delete操作也跟Put一樣存儲,只是Key Type域不一樣,以及Value域為空而已。HBase在讀取時,會將擁有Delete操作的數據過濾掉。而具體何時刪除目標數據,則是在對HFile做Compaction時。

2. HFile的兩種生成方式
HFile有兩種生成方式,分別是MemStore Flush和Compaction

  • MemStore Flush
    寫操作(Put、Delete等)在WAL(Write-Ahead Log)提交成功后,馬上會寫入對應Region Server的內存緩沖區(MemStore)中。在MemStore里這些操作是按key排好序的。當MemStore寫滿時,就會將這些數據寫入到HDFS中成為一個HFile。
  • Compaction
    HFile內部的數據是按key排好序的,但HFile之間的數據並不能保證key的順序,也就是說,對於新生成的HFile,其里面的key值並不都比老的HFile的大。因此每次檢索時,都需要在所有HFile中檢索一次,再將結果合並。雖然HBase針對這個設計了各種加速機制(如Bloom Filter),但HFile文件數目一多還是會比較吃力,因此就需要對HFile做合並操作(Compaction)。Compaction分為minor和major兩種級別,本質上都是從幾個HFile生成合並后的HFile(類似於合並幾個有序數組),然后,老的HFile被刪除,起用合並后的HFile。

3. HFile何時會被刪除
上面提到過的,在完成Compaction后,老的HFile就會被刪除,起用合並后的HFile。

4. Snapshot操作的實現
細心的你是否發現了一個事實,HFile是不會被追加或者修改的!HFile一旦生成,就不會再被改變,只有被拿去合並后,生成了新的HFile,完成自己的使命時才會被刪除。

那如果不刪除呢?

比如說,我今天建了個表開始跑業務,這個表總共生成了10個HFile,每二天又生成一些HFile,並因此觸發了合並操作,現在啟用的HFile里有一些是老的沒被合並的,有一些是新的由合並產生的。如果昨天那10個HFile還在,那我只要讓這個表啟用原來的這10個HFile,不就回滾到昨天的狀態了嘛。依靠的是什么?就是這10個HFile自從誕生之后就不會被改動,連追加都不會。他們像琥珀一樣,記錄了這個表昨天的所有數據。

因此,建立Snapshot其實就是把當前所有啟用的HFile文件名記錄下來,並提醒系統在Compaction時不要刪除它們。恢復Snapshot就是重新啟用當時的那些HFile。當然這兩句話說得不嚴謹,還有一些細節要處理,比如建Snapshot時要把內存里的東西也存下來先。具體是這樣的:

  • 建立Snapshot
    1,Master與RegionServer同步,讓他們同時進行MemStore flush
    2,記錄MetaData,即當前表有哪些region,每個region使用的HFile是哪些
    3,“標記”HFile以防被刪除
    *建立Snapshot的過程不需要讓表下線。

  • 恢復Snapshot
    根據Snapshot對應的MetaData恢復各個region,該表需要先下線

總結

本文解析了為什么HBase的Snapshot操作只需要常數時間,不需要復制業務數據。其實說白了就一點,因為HFile生成之后只會被刪除,不會被修改,連追加的修改都不會!

參考:

https://blog.csdn.net/zxln007/article/details/78921838

https://blog.csdn.net/huang_quanlong/article/details/50875567


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM