1. 程式人生 > 程式設計 >HBase 系列(九)——HBase 容災與備份

HBase 系列(九)——HBase 容災與備份

一、前言

本文主要介紹 Hbase 常用的三種簡單的容災備份方案,即CopyTableExport/ImportSnapshot。分別介紹如下:

二、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 常用命令

  1. 同叢集下 CopyTable
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy  tableOrig
複製程式碼
  1. 不同叢集下 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
複製程式碼
  1. 下面是一個官方給的比較完整的例子,指定開始和結束時間,叢集地址,以及只複製指定的列族:
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
複製程式碼

https://github.com/heibaiying

三、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 常用命令

  1. 匯出命令
hbase org.apache.hadoop.hbase.mapreduce.Export tableName  hdfs 路徑/tableName.db
複製程式碼
  1. 匯入命令
hbase org.apache.hadoop.hbase.mapreduce.Import tableName  hdfs 路徑/tableName.db
複製程式碼

四、Snapshot

4.1 簡介

HBase 的快照 (Snapshot) 功能允許您獲取表的副本 (包括內容和元資料),並且效能開銷很小。因為快照儲存的僅僅是表的元資料和 HFiles 的資訊。快照的 clone 操作會從該快照建立新表,快照的 restore 操作會將表的內容還原到快照節點。clonerestore 操作不需要複製任何資料,因為底層 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 在日誌級別工作,而快照在檔案系統級別工作,因此在還原之後,會出現副本與主伺服器處於不同的狀態的情況。這時候可以先停止同步,所有伺服器還原到一致的資料點後再重新建立同步。

參考資料

  1. Online Apache HBase Backups with CopyTable
  2. Apache HBase ™ Reference Guide

更多大資料系列文章可以參見 GitHub 開源專案大資料入門指南