如何跨 CDP 集羣通過 HBase 快照遷移數據

  1. 文檔編寫目的

該文檔主要通過使用 HBase 快照導出歷史全量數據並還原到新的 HBase 集羣,然後改造源生的 ExportSnapshot 類,通過比較變化的文件實現導出增量,並最終實現 HBase 跨集羣的增量備份和還原。 

1.CDH7.1.4、啓用 Kerberos、hbase 2.2.3

2.CDP7.1.6 、啓用 Kerberos、hbase 2.2.3

  1. 使用 ldapuser1 用戶操作

  2. 操作步驟

2.1 在 cdp7.1.4 生成一張測試的表

2.1.1 使用 HBase 的 pe 命令生成一個 10G 的表

hbase org.apache.hadoop.hbase.PerformanceEvaluation --compress=SNAPPY --size=10 sequentialWrite 10

建表權限不夠報錯

在 ranger 配置如下

2.1.2 TestTable 表 HDFS 大小

hadoop fs -du -h /hbase/data/default/

此處由於指定了 TestTable 表的壓縮格式爲 SNAPPY,所以在 HDFS 上只有 2.5GB

2.1.3 TestTable 表的總數據量,共 10485760 條數據

count 'TestTable'

2.2 通過快照實現 HBase 跨集羣的全量數據備份和還原

2.2.1 生成 TestTable 錶快照

snapshot 'TestTable','TestTable-snapshot1'

2.2.2 導出 TestTable 快照數據

在命令行使用 HBase 自帶的 ExportSnapshot 導出快照

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot TestTable-snapshot1 -copy-to hdfs://cdp02:8020/tmp/hbasebackup/TestTable-snapshot1

查看導出的快照數據

hadoop fs -ls /tmp/hbasebackup/TestTable-snapshot1

hadoop fs -du -h /tmp/hbasebackup/TestTable-snapshot1

可以看到導出快照實際是把快照的信息及快照記錄的所有數據文件分別導出到指定目錄下的. hbase-snapshot 和 archive 目錄下。

CDSW 產品文檔的格式和內容發生了重大變化。

2.2.3 將快照數據複製到 cdp7.1.6 集羣

因爲兩個集羣都有 Kerberos 認證,在用到 distcp 命令之前,在兩集羣之間必須做互信(可聯繫 cdh 運維人員)

hadoop distcp hdfs://cdp02:8020/tmp/hbasebackup/TestTable-snapshot1/.hbase-snapshot/TestTable-snapshot1 hdfs://cdh3.macro.com:8020/hbase/.hbase-snapshot
hadoop distcp hdfs://cdp02:8020/tmp/hbasebackup/TestTable-snapshot1/archive/data/default/TestTable hdfs://cdh3.macro.com:8020/hbase/archive/data/default

複製報錯,權限不足

集羣 cdp7.1.6ranger 配置如下

查看複製到 cdp7.1.6 集羣上的快照數據

hdfs dfs -ls hdfs://cdh3.macro.com:8020/hbase/.hbase-snapshot
hdfs dfs -ls hdfs://cdh3.macro.com:8020/hbase/archive/data/default
hdfs dfs -du -h hdfs://cdh3.macro.com:8020/hbase/

2.2.4 使用 TestTable-snapshot1 快照恢復 TestTable 表

開通以下權限,不然會報權限不足的問題

如果不開通會報下面的錯誤

list_snapshots
restore_snapshot 'TestTable-snapshot1'

2.2.5 驗證恢復後的表數據是否與快照時數據一致

通過快照恢復的數據與快照時的數據總條數一致,表內容一致。

2.3 通過快照實現 HBase 跨集羣的增量數據備份和還原

2.3.1 修改 TestTable 表數據

通過 hbase shell 修改一條數據和增加一條數據

put 'TestTable','11111111111111111111111111','info0:AppendTest','1111'
put 'TestTable','00000000000000000000000000','info0:AppendTest','00000'

TestTable 表的數據總量爲 10485761

count 'TestTable'

2.3.2 再次創建 TestTable 錶快照

snapshot 'TestTable','TestTable-snapshot2'

2.3.3 導出第二次快照的增量數據

這一步主要是將 TestTable-snapshot2 與 TestTable-snapshot1 兩次快照之間的增量數據導出,HBase 默認的 ExportSnapshot 方法是沒有增量快照導出的方法,這裏在原有快照導出的基礎上對源碼進行修改,來完成兩個快照之間增量數據的導出。

github 源碼地址:https://github.com/javaxsky/hbaseexport 有編譯好的 jar 包,下載即可,將裏面的 balancer.jar 和 hbase-export-1.0-SNAPSHOT.jar 放在目錄 “/opt/cloudera/parcels/CDH/lib/hbase/lib”

在命令行執行如下命令將兩次快照的增量數據導出到 HDFS

hbase org.hadoop.hbase.dataExport.ExportSnapshot -snapshot TestTable-snapshot2 -copy-to hdfs://cdp02:8020/tmp/hbasebackup/snapshot2-snapshot1/ -snapshot-old TestTable-snapshot1

導出的數據目錄

hadoop fs -du -h /tmp/hbasebackup/snapshot2-snapshot1

2.3.4 將導出的快照文件複製到 CDP7.1.6 集羣

hadoop distcp hdfs://cdp02:8020/tmp/hbasebackup/snapshot2-snapshot1/.hbase-snapshot/TestTable-snapshot2 hdfs://cdh3.macro.com:8020/hbase/.hbase-snapshot
hadoop distcp hdfs://cdp02:8020/tmp/hbasebackup/snapshot2-snapshot1/archive/data/default/TestTable hdfs://cdh3.macro.com:8020/hbase/archive/data/default

導入增量數據後數據目錄

hdfs dfs -du -h hdfs://cdh3.macro.com:8020/hbase/

2.3.5 命令行使用快照恢復 TestTable 表數據並校驗數據

disable 'TestTable'
list_snapshots
restore_snapshot 'TestTable-snapshot2'
enable 'TestTable'
get 'TestTable','00000000000000000000000000'
count 'TestTable'

  1. 總結

HBase 的 Snapshot 僅涉及 metadata 的記錄,不會涉及數據的拷貝

HBase 的 ExportSnapshot 導出快照操作時在 HDFS 層級進行的,不會對 HBase 的 Master 和 RegionServer 服務造成額外的負擔。

重寫的 ExportSnapshot 增量快照導出是通過兩個快照文件列表的差異實現,只需要將有差異的文件導出即可。

使用 ExportSnapshot 導出快照數據時未造成導出數據膨脹,與原始啓用了 Snappy 壓縮的 HBase 表大小基本一致。

在修改 HBase 自帶的 ExportSnapshot,需要根據對應的 HBase 版本獲取源碼進行修改,不同版本的 ExportSnapshot 的 Packages 路徑有改動。

在跨集羣傳輸 SnapShot 文件時推薦使用 Cloudera 企業版功能 BDR,實現跨集羣的文件拷貝傳輸。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Y3JcT918m5ANiTBhPJxP0w