HBase的數據備份
1.1 基於HBase提供的類對錶進行備份
-
使用HBase提供的類把HBase中某張表的數據導出到HDFS,之後再導出到測試hbase表中。
-
(1) ==從hbase表導出到HDFS==
[hadoop@node01 shells]$ hbase org.apache.hadoop.hbase.mapreduce.Export myuser /hbase_data/myuser_bak
-
(2) ==文件導入hbase表==
hbase shell中創建備份目標表
create 'myuser_bak','f1','f2'
-
將HDFS上的數據導入到備份目標表中
hbase org.apache.hadoop.hbase.mapreduce.Driver import myuser_bak /hbase_data/myuser_bak/*
-
補充說明
以上都是對數據進行了全量備份,後期也可以實現表的增量數據備份,增量備份跟全量備份操作差不多,只不過要在後面加上時間戳。
例如:
HBase數據導出到HDFShbase org.apache.hadoop.hbase.mapreduce.Export test /hbase_data/test_bak_increment 開始時間戳 結束時間戳
1.2 基於snapshot快照對錶進行備份
-
通過snapshot快照的方式實現HBase數據的遷移和拷貝。這種方式比較常用,效率高,也是最爲推薦的數據遷移方式。
-
HBase的snapshot其實就是一組==metadata==信息的集合(文件列表),通過這些metadata信息的集合,就能將表的數據回滾到snapshot那個時刻的數據。
- 首先我們要了解一下所謂的HBase的LSM類型的系統結構,我們知道在HBase中,數據是先寫入到Memstore中,當Memstore中的數據達到一定條件,就會flush到HDFS中,形成HFile,後面就不允許原地修改或者刪除了。
- 如果要更新或者刪除的話,只能追加寫入新文件。既然數據寫入以後就不會在發生原地修改或者刪除,這就是snapshot做文章的地方。做snapshot的時候,只需要給快照表對應的所有文件創建好指針(元數據集合),恢復的時候只需要根據這些指針找到對應的文件進行恢復就Ok。這是原理的最簡單的描述,下圖是描述快照時候的簡單流程:
1.3 快照實戰
- 1、創建表的snapshot
snapshot 'tableName', 'snapshotName'
-
2、查看snapshot
list_snapshots
查找以test開頭的snapshot
list_snapshots 'test.*'
- 3、恢復snapshot
ps:這裏需要對錶進行disable操作,先把表置爲不可用狀態,然後在進行進行restore_snapshot的操作
disable 'tableName'
restore_snapshot 'snapshotName'
enable 'tableName'
-
4、刪除snapshot
delete_snapshot 'snapshotName'
-
5、遷移 snapshot
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot snapshotName \ -copy-from hdfs://src-hbase-root-dir/hbase \ -copy-to hdfs://dst-hbase-root-dir/hbase \ -mappers 1 \ -bandwidth 1024 例如: hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot test \ -copy-from hdfs://node01:8020/hbase \ -copy-to hdfs://node01:8020/hbase1 \ -mappers 1 \ -bandwidth 1024
注意:這種方式用於將快照表遷移到另外一個集羣的時候使用,使用MR進行數據的拷貝,速度很快,使用的時候記得設置好bandwidth參數,以免由於網絡打滿導致的線上業務故障。
-
6、將snapshot使用bulkload的方式導入
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \ hdfs://dst-hbase-root-dir/hbase/archive/datapath/tablename/filename \ tablename 例如: 創建一個新表 create 'newTest','f1','f2' hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://node1:9000/hbase1/archive/data/default/test/6325fabb429bf45c5dcbbe672225f1fb newTest
dIncrementalHFiles hdfs://node1:9000/hbase1/archive/data/default/test/6325fabb429bf45c5dcbbe672225f1fb newTest
##