一、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