HBase的資料備份容災遷移方案:Distcp,CopyTable,Export/Import,Snapshot,Replication
一、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