一、前言 本文主要介紹 Hbase 常用的三種簡單的容災備份方案,即 CopyTable 、 Export / Import 、 Snapshot 。分別介紹如下: 二、CopyTable 2.1 簡介 CopyTable 可以將現有表的數據複製到新表中,具有以下特點: 支持時間區間 、row 區間 ...
一、前言
本文主要介紹 Hbase 常用的三種簡單的容災備份方案,即CopyTable、Export/Import、Snapshot。分別介紹如下:
二、CopyTable
2.1 簡介
CopyTable可以將現有表的數據複製到新表中,具有以下特點:
- 支持時間區間 、row 區間 、改變表名稱 、改變列族名稱 、以及是否 Copy 已被刪除的數據等功能;
- 執行命令前,需先創建與原表結構相同的新表;
CopyTable
的操作是基於 HBase Client API 進行的,即採用scan
進行查詢, 採用put
進行寫入。
2.2 命令格式
Usage: CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] <tablename>
2.3 常用命令
- 同集群下 CopyTable
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy tableOrig
- 不同集群下 CopyTable
# 兩表名稱相同的情況
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=dstClusterZK:2181:/hbase tableOrig
# 也可以指新的表名
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--peer.adr=dstClusterZK:2181:/hbase \
--new.name=tableCopy tableOrig
- 下麵是一個官方給的比較完整的例子,指定開始和結束時間,集群地址,以及只複製指定的列族:
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
--starttime=1265875194289 \
--endtime=1265878794289 \
--peer.adr=server1,server2,server3:2181:/hbase \
--families=myOldCf:myNewCf,cf2,cf3 TestTable
2.4 更多參數
可以通過 --help
查看更多支持的參數
# hbase org.apache.hadoop.hbase.mapreduce.CopyTable --help
三、Export/Import
3.1 簡介
Export
支持導出數據到 HDFS,Import
支持從 HDFS 導入數據。Export
還支持指定導出數據的開始時間和結束時間,因此可以用於增量備份。Export
導出與CopyTable
一樣,依賴 HBase 的scan
操作
3.2 命令格式
# Export
hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> [<versions> [<starttime> [<endtime>]]]
# Inport
hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>
- 導出的
outputdir
目錄可以不用預先創建,程式會自動創建。導出完成後,導出文件的所有權將由執行導出命令的用戶所擁有。 - 預設情況下,僅導出給定
Cell
的最新版本,而不管歷史版本。要導出多個版本,需要將<versions>
參數替換為所需的版本數。
3.3 常用命令
- 導出命令
hbase org.apache.hadoop.hbase.mapreduce.Export tableName hdfs 路徑/tableName.db
- 導入命令
hbase org.apache.hadoop.hbase.mapreduce.Import tableName hdfs 路徑/tableName.db
四、Snapshot
4.1 簡介
HBase 的快照 (Snapshot) 功能允許您獲取表的副本 (包括內容和元數據),並且性能開銷很小。因為快照存儲的僅僅是表的元數據和 HFiles 的信息。快照的 clone
操作會從該快照創建新表,快照的 restore
操作會將表的內容還原到快照節點。clone
和 restore
操作不需要複製任何數據,因為底層 HFiles(包含 HBase 表數據的文件) 不會被修改,修改的只是表的元數據信息。
4.2 配置
HBase 快照功能預設沒有開啟,如果要開啟快照,需要在 hbase-site.xml
文件中添加如下配置項:
<property>
<name>hbase.snapshot.enabled</name>
<value>true</value>
</property>
4.3 常用命令
快照的所有命令都需要在 Hbase Shell 互動式命令行中執行。
1. Take a Snapshot
# 拍攝快照
hbase> snapshot '表名', '快照名'
預設情況下拍攝快照之前會在記憶體中執行數據刷新。以保證記憶體中的數據包含在快照中。但是如果你不希望包含記憶體中的數據,則可以使用 SKIP_FLUSH
選項禁止刷新。
# 禁止記憶體刷新
hbase> snapshot '表名', '快照名', {SKIP_FLUSH => true}
2. Listing Snapshots
# 獲取快照列表
hbase> list_snapshots
3. Deleting Snapshots
# 刪除快照
hbase> delete_snapshot '快照名'
4. Clone a table from snapshot
# 從現有的快照創建一張新表
hbase> clone_snapshot '快照名', '新表名'
5. Restore a snapshot
將表恢復到快照節點,恢復操作需要先禁用表
hbase> disable '表名'
hbase> restore_snapshot '快照名'
這裡需要註意的是:是如果 HBase 配置了基於 Replication 的主從複製,由於 Replication 在日誌級別工作,而快照在文件系統級別工作,因此在還原之後,會出現副本與主伺服器處於不同的狀態的情況。這時候可以先停止同步,所有伺服器還原到一致的數據點後再重新建立同步。
參考資料
更多大數據系列文章可以參見 GitHub 開源項目: 大數據入門指南