1. 程式人生 > >HBase的資料備份容災遷移方案:Distcp,CopyTable,Export/Import,Snapshot,Replication

HBase的資料備份容災遷移方案:Distcp,CopyTable,Export/Import,Snapshot,Replication

HBase的資料備份或者容災方案有這幾種:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分別介紹(以下描述的內容均是基於0.94.20版本)。

一、Distcp

   在使用distcp命令copy hdfs檔案的方式實現備份時,需要禁用備份表確保copy時該表沒有資料寫入,對於線上服務的hbase叢集,該方式不可用,而且在一些文章中可以看到通過distcp檔案恢復hbase表時需使用:

bin/hbase org.jruby.Main bin/add_table.rb /hbase/testtable命令把從hdfs目錄中恢復表的元資料,然後重啟hbase,但是0.94之後的版本的bin目錄下均沒有找到add_table.rb檔案,似乎hbase已經廢棄該功能。

二、CopyTable

  執行命令前,需先建立表

  支援時間區間、row區間,改變表名稱,改變列簇名稱,指定是否copy刪除資料等功能,例如:

 hbase org.apache.hadoop.hbase.mapreduce.CopyTable --starttime=1265875194289 --endtime=1265878794289 --peer.adr= dstClusterZK:2181:/hbase --families=myOldCf:myNewCf,cf2,cf3 TestTable

    1、同一個叢集不同表名稱

      hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=tableCopy  srcTable

    2、跨叢集copy表

      hbase org.apache.hadoop.hbase.mapreduce.CopyTable --peer.adr=dstClusterZK:2181:/hbase srcTable

   該方式,原表、目標表的名稱相同

   全部使用方式如下:

    

   MR的map數量與表的region數相同,與HFile檔案個數無關。

   CopyTable工具採用scan查詢,寫入新表時採用put和delete API,全是基於hbase的client api進行讀寫,無法使用Import工具的bulk匯入。

  三、Export/Import

  通過Export匯出資料到目標叢集的hdfs,再在目標叢集執行import匯入資料,Export支援指定開始時間和結束時間,因此可以做增量備份,Export工具引數如下:  


    可見,在匯出時可以指定version,starttime,endtime等引數,並且可以通過-D指定是否壓縮,指定caching等屬性,比如:

hbase org.apache.hadoop.hbase.mapreduce.Export test4 hdfs://t2-namenode:9000/test4_90 1 1415693812520 1415694912520

Export匯出工具與CopyTable一樣是依賴hbase的scan讀取資料,並且採用的InportFormat與CopyTable一樣是TableInputFormat類,從該類的getSplits()方法可以看出MR的map數與hbase表的region數相同。

Import工具引數如下:   


   在import時可以指定使用bulk的方式,bulk是生成hfile格式的檔案,直接匯入到Region,無需經歷hbase的寫資料過程,從而無需消耗memstore,無需Flush等,更加高效,如果不指定bulk檔案路徑(hdfs的路徑)則會採用hbase 的put和delete API進行寫入。

To import 0.94 exported files in a 0.96 cluster or onwards, you need to set system property "hbase.import.version" when running the import command as below:

$ bin/hbase -Dhbase.import.version=0.94 org.apache.hadoop.hbase.mapreduce.Import <tablename> <inputdir>

使用Import工具前必須先建立表,關於hbase.import.version屬性是0.96的功能。

注: hbase可以使用filter和export和import

結合:hbase org.apache.hadoop.hbase.mapreduce.Driver

  四、Snapshot

  開啟快照功能,在hbase-site.xml檔案中新增如下配置項:

       <property>

        <name>hbase.snapshot.enabled</name>

        <value>true</value>

    </property>

在hbase shell中使用clone_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot命令可是是想建立快照,檢視快照,通過快照恢復表,通過快照建立一個新的表等功能,需要注意的是:如果該表開啟了replication功能實現主從同步則在使用restore_snapshot功能對主表進行恢復時,必須先停止replication功能並且redo the bootstrap,因為replication是基於WAL日誌實現的,而snapshot是直接在hdfs層面不是基於hbase的put、delete等API進行的,不會寫WAL日誌。

在建立snapshot後,可以通過ExportSnapshot工具把快照匯出到另外一個叢集,實現資料備份或者資料遷移,ExportSnapshot工具的用法如下:

 例如:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot test4_snapshot_201411111422 -copy-to hdfs://t2-namenode:9000/hbase -mappers 2

執行該命令後,在t2-namenode:9000的hdfs中會把test4_snapshot_201411111422資料夾copy到/hbase/.hbase-snapshot檔案下,進入t2-namenode這個hbase叢集,執行list_snapshots會看到有一個快照:test4_snapshot_201411111422,通過命令clone_snapshot可以把該快照copy成一個新的表,不用提前建立表,新表的region個數等資訊完全與快照保持一致。

在使用snapshot把一個叢集的資料copy到新集群后,應用程式開啟雙寫,然後可以使用Export工具把快照與雙寫之間的資料匯入到新叢集,從而實現資料遷移,為保障資料不丟失,Export匯出時指定的時間範圍可以適當放寬。

五、Replication

可以通過replication機制實現hbase叢集的主從模式,具體步驟如下:

    1、  zookeeper不能被hbase託管,如果主從hbase叢集共用一個zk叢集,則zookeeper.znode.parent不能都是預設的hbase,可以配置為hbase-master和hbase-slave

    2、 在主hbase叢集的hbase-site.xml中新增配置項:

<property>

    <name>hbase.replication</name>

    <value>true</value>

     </property>

<property>

    <name>replication.source.nb.capacity</name>

    <value>25000</value>

<description>主叢集每次向從叢集傳送的entry最大的個數,預設值25000,可根據叢集規模做出適當調整</description>

     </property>

<property>

<name>replication.source.size.capacity</name>

<value>67108864</value>

<description>主叢集每次向從叢集傳送的entry的包的最大值大小,預設為64M</description>

</property>

<property>

<name>replication.source.ratio</name>

<value>1</value>

<description>主叢集使用的從叢集的RS的資料百分比,預設為0.1,需調整為1,充分利用從叢集的RS</description>

</property>

<property>

<name>replication.sleep.before.failover</name>

<value>2000</value>

<description>主叢集在RS宕機多長時間後進行failover,預設為2秒,具體的sleep時間是: sleepBeforeFailover + (long) (new Random().nextFloat() * sleepBeforeFailover) </description>

</property>

<property>

<name>replication.executor.workers</name>

<value>1</value>

<description>從事replication的執行緒數,預設為1,如果寫入量大,可以適當調大</description>

</property>

   3、在從hbase叢集的hbase-site.xml中新增:

<property>

    <name>hbase.replication</name>

    <value>true</value>

     </property>

   4、 進入主叢集的shell,執行:

add_peer 'ID' 'CLUSTER_KEY'

The ID must be a short integer. To compose the CLUSTER_KEY, use the following template:

hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent

This will show you the help to setup the replication stream between both clusters. If both clusters use the same Zookeeper cluster, you have to use a different zookeeper.znode.parent since they can't write in the same folder.

   5、  在從叢集中建立一個與master叢集相同的表

   6、 修改表定義,開啟複製功能

disable 'your_table'

alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}

    enable 'your_table

此處的REPLICATION_SCOPE => '1'中的1,與第3步中設定到“ID”相同

可以通過工具VerifyReplication對複製的資料一致性進行校驗,需在主叢集執行,例如:

hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --starttime=1265875194289 --stoptime=2265878794289 1 test4

用法如下: 

 提示:

   1、 hbase的replication,如果是在建立主表和從表的關係前,主表已經有資料則該部分資料不會被同步到從表中,因為replication是依賴WAL日誌進行的同步,可以通過如下步驟實現:

      a)   通過snapshot把歷史資料匯入到從叢集;

      b)   開啟replication;

      c)   通過Export工具把快照和開啟replication之間的資料匯入到從表;

      d)   通過VerifyReplication工具校驗資料的一致性。

   2、  如果客戶端在寫入資料時設定不寫WAL日誌,則會導致從叢集不會同步資料;

   3、  主從同步是非同步的,因此資料不一定會立即同步到從表;

   4、  建立主、從表後,在向主表寫入資料時,停止從叢集,寫完後再開啟從叢集,這時如果主叢集的WAL日誌還在則會同步到從表中;

由於不寫WAL日誌的資料不會被同步到從叢集,因此對於重要的資料建議再通過snapshot進行定期的備份。

以上介紹的幾種hbase資料遷移方案,有些可以實現不同叢集之間的hbase資料表進行資料遷移。但是有些事由mr實現的,所以當網路效能不是很理想的時候,會影響遷移效果,可能會導致資料的丟失。接下來介紹一種手動的資料遷移方式,雖然繁瑣,但是對於不同叢集的hbase資料之間的遷移更穩定

手動遷移方案:

1、從源hbase叢集中複製出Hbase資料庫表到本地目錄

hbase fs -get

2、目的Hbase匯入

hbase fs -put

3、修復.META.表

hbase hbck  -fixMeta

4、重新分配資料到各RegionServer

hbase hbck -fixAssignments

轉自:http://itindex.net/detail/51698-hbase-%E6%95%B0%E6%8D%AE-%E5%A4%87%E4%BB%BD?utm_source=tuicool&utm_medium=referral