32.1 實驗環境需求
- CM和CDH版本為5.13.0
- 使用root用戶操作
- HBase0.95+
32.1.1 資訊描述
- 使用HBase的PerformanceEvaluation生成一張SNAPPY格式的表
- 使用HBase的pe命令生成一個10G的表
[root@ip-172-31-5-190 fayson]# hbase org.apache.hadoop.hbase.PerformanceEvaluation --compress=SNAPPY --size=10 sequentialWrite 10
- TestTable表結構
hbase(main):013:0* desc 'TestTable'
Table TestTable is ENABLED
TestTable
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => '
SNAPPY', VERSIONS => '1', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65
536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.0540 seconds
hbase(main):014:0>
- TestTable表HDFS大小
- 此處由于指定了TestTable表的壓縮格式為SNAPPY,所以在HDFS上只有2.5GB
[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbase/data/default/
2.5 G 7.5 G /hbase/data/default/TestTable
334 1002 /hbase/data/default/picHbase
[root@ip-172-31-6-148 ~]#
- TestTable表的總資料量,共10485760條資料
32.2 HBase跨集群全量資料備份&還原
生成TestTable表快照
- 通過CM生成TestTable表快照TestTable-snapshot1
匯出TestTable快照資料
- 在命令列使用HBase自帶的ExportSnapshot匯出快照
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; background-color: rgb(202, 230, 202);">[root@ip-172-31-6-148 ~]# hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot TestTable-snapshot1 -copy-to hdfs://ip-172-31-6-148.fayson.com:8020/hbasebackup/TestTable-snapshot1</pre>
- 查看匯出的快照資料
[root@ip-172-31-6-148 ~]# hadoop fs -ls /hbasebackup/TestTable-snapshot1
Found 2 items
drwxr-xr-x - root supergroup 0 2017-11-02 04:22 /hbasebackup/TestTable-snapshot1/.hbase-snapshot
drwxr-xr-x - root supergroup 0 2017-11-02 04:21 /hbasebackup/TestTable-snapshot1/archive
[root@ip-172-31-6-148 ~]#
- 查看匯出快照資料大小
[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbasebackup/TestTable-snapshot1
1.2 K 3.6 K /hbasebackup/TestTable-snapshot1/.hbase-snapshot
2.5 G 7.6 G /hbasebackup/TestTable-snapshot1/archive
[root@ip-172-31-6-148 ~]#
- 可以看到匯出快照實際是把快照的資訊及快照記錄的所有資料檔案分別匯出到指定目錄下的.hbase-snapshot和archive目錄下,
匯入快照并恢復TestTable表
- Fayson這里使用的是一個集群做快斬訓出與恢復操作,所以這里先把集群TestTable的快照和表刪掉,然后再通過匯出快照和資料將TestTable表恢復
- 通過CM洗掉TestTable-snapshot1快照資料
- 通過hbase shell把TestTable DROP掉
- 確認TestTable表的資料已完全被清除
[root@ip-172-31-6-148 ~]# hbase shell
hbase(main):002:0> disable 'TestTable'
hbase(main):003:0> drop 'TestTable'
- 將匯出的快照資料恢復至相應的目錄
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(51, 51, 51); font-size: 17px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.544px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; background-color: rgb(202, 230, 202);">*[root@ip-172-31-6-148* ~]# sudo -u hbase hadoop fs -cp /hbasebackup/TestTable-snapshot1/.hbase-snapshot/TestTable-snapshot1 /hbase/.hbase-snapshot *[root@ip-172-31-6-148* ~]# sudo -u hbase hadoop fs -cp /hbasebackup/TestTable-snapshot1/archive/data/default/TestTable /hbase/archive/data/default/</pre>
- 將匯出的快照目錄拷貝至/hbase/.hbase-snapshot目錄,匯出的歸檔檔案拷貝至/hbase/archive目錄下,如果目錄不存在則直接使用匯出的歸檔目錄覆寫/hbase/archive目錄即可,
- 通過CM界面,使用TestTable-snapshot1快斬訓復TestTable表
- 此時可以看到TestTable狀態為已洗掉,接下來執行快斬訓復操作
- 表狀態顯示正常
- 驗證恢復后的表資料是否與快照時資料一致
- 通過快斬訓復的資料與快照時的資料總條數一致,表內容一致,
32.3 HBase跨集群增量資料備份&還原
修改TestTable表資料
- 使用Pe命令為TestTable表每一行增加一列Cloumn
[root@ip-172-31-6-148 ~]# hbase pe append 1
- 通過hbase shell隨機修改和洗掉表資料
- TestTable表的資料總量為10485757
put 'TestTable','00000000000000000000000000','info:0','00000000000'
put 'TestTable','00000000000000000000000000','info:AppendTest','00000'
deleteall 'TestTable','00000000000000000000000001'
deleteall 'TestTable','00000000000000000000000005'
deleteall 'TestTable','00000000000000000000009991'
put 'TestTable','00000000000000000000000009','info:AppendTest','99999999'
delete 'TestTable','00000000000000000000012345','info:0'
再次創建TestTable表快照
- 匯出第二次快照的增量資料
- 這一步主要是將TestTable-snapshot2與TestTable-snapshot1兩次快照之間的增量資料匯出,HBase默認的ExportSnapshot方法是沒有增量快斬訓出的方法,這里Fayson在原有快斬訓出的基礎上對原始碼進行修改,來完成兩個快照之間增量資料的匯出,
- 在命令列執行如下命令將兩次快照的增量資料匯出到HDFS
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(51, 51, 51); font-size: 17px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.544px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; background-color: rgb(202, 230, 202);">*[root@ip-172-31-6-148* ~]# hbase org.hadoop.hbase.dataExport.ExportSnapshot -snapshot TestTable-snapshot2 -copy-to hdfs://ip-172-31-6-148.fayson.com:8020/hbasebackup/snapshot2-snapshot1/ -snapshot-old TestTable-snapshot1</pre>
- 匯出的資料目錄
- 通過以下匯出的快照資料檔案及大小可以看出使用快照增量匯出的方式只將快照中有變化的資料檔案匯出,而非匯出表的全量資料,
[root@ip-172-31-6-148 ~]# hadoop fs -du -h /hbasebackup/snapshot2-snapshot1
1.6 K 4.7 K /hbasebackup/snapshot2-snapshot1/.hbase-snapshot
655.6 M 1.9 G /hbasebackup/snapshot2-snapshot1/archive
[root@ip-172-31-6-148 ~]#
匯入增量快照資料并恢復表
- 匯入增量資料前相應目錄資料
- HBase的快照目錄
- 歸檔目錄TestTable表資料
- 將匯出的快照增量資料匯入到HDFS相應目錄
[root@ip-172-31-6-148 lib]# sudo -u hbase hadoop fs -cp /hbasebackup/snapshot2-snapshot1/.hbase-snapshot/TestTable-snapshot2 /hbase/.hbase-snapshot
[root@ip-172-31-6-148 lib]# sudo -u hbase hadoop fs -cp /hbasebackup/snapshot2-snapshot1/archive/data/default/TestTable /hbase/archive/data/default/
- 匯入增量資料后資料目錄
- HBase快照目錄
- 歸檔目錄資料
- 通過CM界面使用TestTable-snapshot2快斬訓復TestTable表資料
32.4 增量匯出原始碼修改說明
- 代碼中增加對比快照引數-snapshot-old
if (cmd.equals("-snapshot")) {
snapshotName = args[++i];
} else if (cmd.equals("-snapshot-old")) {
snapshotOldName = args[++i];
} else if (cmd.equals("-target")) {
targetName = args[++i];
}
- 修改匯出檔案邏輯,對比新舊快照檔案串列差異,將有差異的資料檔案匯出
//TODO 增加快照增量檔案判斷邏輯
String snapshotOldPath = conf.get(CONF_SNAPSHOT_OLD_DIR);
if(snapshotOldPath != null && snapshotOldPath.length() > 0) {
LOG.info("測驗snapshotOldDir:" + conf.get(CONF_SNAPSHOT_OLD_DIR));
Path snapshotOldDir = new Path(conf.get(CONF_SNAPSHOT_OLD_DIR));
FileSystem oldFs = FileSystem.get(snapshotOldDir.toUri(), conf);
List<Pair<SnapshotFileInfo, Long>> snapshotOldFiles = getSnapshotFiles(conf, oldFs, snapshotOldDir);
Set<String> oldFiles = new HashSet<String>();
for(Pair<SnapshotFileInfo, Long> pair : snapshotOldFiles) {
LOG.info("測驗OLD:SnapShotFileInfo:" + pair.getFirst().getHfile());
oldFiles.add(pair.getFirst().getHfile());
}
for(Pair<SnapshotFileInfo, Long> pair : origSnapshotFiles) {
String hfile = pair.getFirst().getHfile();
if(!oldFiles.contains(hfile)) {
LOG.info("新增的:SnapShotFileInfo:" + pair.getFirst().getHfile());
snapshotFiles.add(pair);
}
}
} else {
snapshotFiles = origSnapshotFiles;
}
- 將修改的原始碼編譯成dataExport-0.0.1-SNAPSHOT.jar包,將該jar檔案放入/opt/cloudera/parcels/CDH/lib/hbase/lib目錄下
32.5 實驗總結
- HBase的Snapshot僅涉及metadata的記錄,不會涉及資料的拷貝
- HBase的ExportSnapshot匯出快照操作時在HDFS層級進行的,不會對HBase的Master和RegionServer服務造成額外的負擔,
- 重寫的ExportSnapshot增量快斬訓出是通過兩個快照檔案串列的差異實作,只需要將有差異的檔案匯出即可,
- 使用ExportSnapshot匯出快照資料時未造成匯出資料膨脹,與原始啟用了Snappy壓縮的HBase表大小基本一致,
- 在修改HBase自帶的ExportSnapshot,需要根據對應的HBase版本獲取原始碼進行修改,不同版本的ExportSnapshot的Packages路徑有改動,
- 在跨集群傳輸SnapShot檔案時推薦使用Cloudera企業版功能BDR,實作跨集群的檔案拷貝傳輸,
大資料視頻推薦:
CSDN
大資料語音推薦:
企業級大資料技術應用
大資料機器學習案例之推薦系統
自然語言處理
大資料基礎
人工智能:深度學習入門到精通
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293541.html
標籤:其他
上一篇:互聯網黑話匯總大合集
下一篇:MQ相關基礎知識
