離線將資料從 HBase 遷移至 Bigtable

本頁說明將資料從 Apache HBase 叢集遷移至Google Cloud上的 Bigtable 執行個體時,使用者必須留意哪些事項和必須執行哪些程序。

本頁所述程序需要您將應用程式離線。如要遷移資料且不希望停機,請參閱「從 HBase 複製到 Bigtable」一文,瞭解線上遷移的相關指引。

如要將資料從託管在 Google Cloud 服務 (例如 Dataproc 或 Compute Engine) 上的 HBase 叢集遷移至 Bigtable,請參閱「將託管在 Google Cloud 的 HBase 遷移至 Bigtable」。

開始遷移之前,您應該考慮效能影響、Bigtable 結構定義設計、您採取的驗證和授權方法,以及 Bigtable 特徵集。

遷移前注意事項

本節提供幾項建議,供您在開始遷移前參考。

成效

在一般工作負載下,Bigtable 提供非常容易預測的效能。遷移資料前,請務必瞭解影響 Bigtable 效能的因素。

Bigtable 結構定義設計

在大多數情況下,您可以在 Bigtable 中使用與 HBase 相同的結構定義設計。如要變更結構定義或使用案例,請先查閱設計結構定義中提出的概念,再遷移資料。

驗證及授權

設計 Bigtable 的存取控制之前,請檢視現有的 HBase 驗證和授權過程。

Bigtable 使用 Google Cloud的標準驗證機制和身分與存取權管理機制來提供存取權控管,因此您需要將 HBase 的現有授權轉換為 IAM。您可以將現有的 Hadoop 群組 (為 HBase 提供存取控制機制) 對應至不同的服務帳戶。

Bigtable 允許您在專案、執行個體和資料表層級控管存取權。如需詳細資訊,請參閱存取控制

停機時間規定

本頁所述的遷移方法會讓應用程式在遷移期間離線。如果您的業務無法在遷移至 Bigtable 時容忍停機,請參閱「從 HBase 複製到 Bigtable」一文中的線上遷移指南。

將 HBase 遷移至 Bigtable

如要將資料從 HBase 遷移到 Bigtable,請將每個資料表的 HBase 快照匯出至 Cloud Storage,然後將資料匯入 Bigtable。這些步驟適用於單一 HBase 叢集,我們會在接下來的幾節中詳細說明。

  1. 停止將寫入作業傳送至 HBase 叢集。
  2. 為 HBase 叢集資料表建立快照。
  3. 將快照檔案匯出至 Cloud Storage。
  4. 計算雜湊並匯出至 Cloud Storage。
  5. 在 Bigtable 中建立目的地資料表。
  6. 將 Cloud Storage 中的 HBase 資料匯入 Bigtable。
  7. 驗證匯入的資料。
  8. Route 會寫入 Bigtable。

事前準備

  1. 建立 Cloud Storage 值區來儲存快照。在您打算執行 Dataflow 工作的位置建立值區。

  2. 建立 Bigtable 執行個體,儲存新資料表。

  3. 找出要匯出的 Hadoop 叢集。您可以直接在 HBase 叢集上執行遷移作業,也可以在與 HBase 叢集 NameNode 和 Datanode 建立網路連線的獨立 Hadoop 叢集上執行。

  4. 在 Hadoop 叢集的每個節點,以及啟動工作的主機上,安裝並設定 Cloud Storage 連接器。如需詳細的安裝步驟,請參閱「安裝 Cloud Storage 連接器」。

  5. 在可連線至 HBase 叢集和 Bigtable 專案的主機上,開啟命令殼層。您將在這裡完成後續步驟。

  6. 取得結構定義翻譯工具:

    wget BIGTABLE_HBASE_TOOLS_URL
    

    BIGTABLE_HBASE_TOOLS_URL 換成工具 Maven 存放區中提供的最新 JAR with dependencies 網址。檔案名稱類似於 https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-tools/1.24.0/bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar

    如要找出網址或手動下載 JAR,請按照下列步驟操作:

    1. 前往存放區。
    2. 按一下最新版本號碼。
    3. 找出 JAR with dependencies file (通常位於頂端)。
    4. 你可以按一下滑鼠右鍵並複製網址,也可以點選下載檔案。
  7. 取得匯入工具:

    wget BIGTABLE_BEAM_IMPORT_URL
    

    BIGTABLE_BEAM_IMPORT_URL 換成工具 Maven 存放區中提供的最新 shaded JAR 網址。檔案名稱類似於 https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-beam-import/1.24.0/bigtable-beam-import-1.24.0-shaded.jar

    如要找出網址或手動下載 JAR,請按照下列步驟操作:

    1. 前往存放區。
    2. 按一下最新版本號碼。
    3. 按一下「已下載的內容」
    4. 將滑鼠游標懸停在 shaded.jar 上。
    5. 你可以按一下滑鼠右鍵並複製網址,也可以點選下載檔案。
  8. 設定下列環境變數:

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export INSTANCE_ID=INSTANCE_ID
    export REGION=REGION
    export CLUSTER_NUM_NODES=CLUSTER_NUM_NODES
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export IMPORT_JAR=IMPORT_JAR
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export MIGRATION_DESTINATION_DIRECTORY="$BUCKET_NAME/hbase-migration-snap"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_DIRECTORY=MIGRATION_SOURCE_DIRECTORY
    

    更改下列內容:

    • PROJECT_ID:執行個體所在的 Google Cloud 專案
    • INSTANCE_ID:要匯入資料的 Bigtable 執行個體 ID
    • REGION:包含 Bigtable 執行個體中其中一個叢集的區域。範例:northamerica-northeast2
    • CLUSTER_NUM_NODES:Bigtable 執行個體中的節點數量
    • TRANSLATE_JAR:從 Maven 下載的 bigtable hbase tools JAR 檔案名稱和版本號碼。該值看起來應該會類似 bigtable-hbase-1.x-tools-1.24.0-jar-with-dependencies.jar
    • IMPORT_JAR:從 Maven 下載的 bigtable-beam-import JAR 檔案名稱和版本號碼。該值看起來應該會類似 bigtable-beam-import-1.24.0-shaded.jar
    • BUCKET_NAME:您儲存快照的 Cloud Storage bucket 名稱
    • ZOOKEEPER_QUORUM:工具將連線的 Zookeeper 主機,格式為 host1.myownpersonaldomain.com
    • MIGRATION_SOURCE_DIRECTORY:HBase 主機上的目錄,包含要遷移的資料,格式為 hdfs://host1.myownpersonaldomain.com:8020/hbase
  9. (選用) 如要確認變數是否設定正確,請執行 printenv 指令,查看所有環境變數。

停止將寫入作業傳送至 HBase

在為 HBase 資料表建立快照前,請停止將寫入內容傳送至 HBase 叢集。

拍攝 HBase 資料表快照

HBase 叢集停止擷取資料後,請為要遷移至 Bigtable 的每個資料表建立快照。

快照一開始在 HBase 叢集上佔用的儲存空間極少,但隨著時間推移,可能會成長到與原始資料表相同的大小。快照不會耗用任何 CPU 資源。

請為每個資料表執行下列指令,並為每個快照使用專屬名稱:

echo "snapshot 'TABLE_NAME', 'SNAPSHOT_NAME'" | hbase shell -n

更改下列內容:

  • TABLE_NAME:您要匯出資料的 HBase 資料表名稱。
  • SNAPSHOT_NAME:新快照的名稱

將 HBase 快照匯出至 Cloud Storage

建立快照後,您需要匯出快照。在實際工作環境 HBase 叢集上執行匯出作業時,請監控叢集和其他 HBase 資源,確保叢集維持良好狀態。

針對要匯出的每個快照,執行下列指令:

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT -snapshot SNAPSHOT_NAME \
    -copy-from $MIGRATION_SOURCE_DIRECTORY \
    -copy-to $MIGRATION_DESTINATION_DIRECTORY/data

SNAPSHOT_NAME 替換為要匯出的快照名稱。

計算及匯出雜湊值

接著,請建立雜湊,以便在遷移作業完成後進行驗證。 HashTable 是 HBase 提供的驗證工具,可計算資料列範圍的雜湊,並將其匯出至檔案。您可以在目標資料表上執行 sync-table 工作,比對雜湊值,確保遷移資料的完整性。

針對匯出的每個資料表執行下列指令:

hbase org.apache.hadoop.hbase.mapreduce.HashTable --batchsize=32000 --numhashfiles=20 \
TABLE_NAME $MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME

更改下列內容:

  • TABLE_NAME:您建立快照並匯出的 HBase 資料表名稱

建立目的地資料表

下一步是在 Bigtable 執行個體中,為匯出的每個快照建立目的地資料表。使用具備執行個體 bigtable.tables.create 權限的帳戶。

本指南使用 Bigtable 結構定義轉換工具,該工具會自動為您建立資料表。不過,如果您不希望 Bigtable 結構定義與 HBase 結構定義完全相符,可以使用 cbt 指令列工具或 Google Cloud 主控台建立資料表

Bigtable 結構定義轉換工具會擷取 HBase 資料表的結構定義,包括資料表名稱、資料欄系列、垃圾收集政策和分割。然後在 Bigtable 中建立類似的資料表。

針對要匯入的每個資料表,執行下列指令,將結構定義從 HBase 複製到 Bigtable。

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$INSTANCE_ID \
 -Dgoogle.bigtable.table.filter=TABLE_NAME \
 -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM \
 -Dhbase.zookeeper.property.clientPort=$ZOOKEEPER_PORT \
 -jar $TRANSLATE_JAR

TABLE_NAME 替換為要匯入的 HBase 資料表名稱。Schema 轉換工具會使用這個名稱做為新的 Bigtable 資料表名稱。

您也可以視需要將 TABLE_NAME 替換為「.*」等正規運算式,擷取要建立的所有資料表,然後只執行一次指令。

使用 Dataflow 將 HBase 資料匯入 Bigtable

準備好要將資料遷移至的表格後,即可匯入及驗證資料。

未壓縮的資料表

如果 HBase 資料表未壓縮,請對要遷移的各個資料表執行下列指令:

java -jar $IMPORT_JAR importsnapshot \
    --runner=DataflowRunner \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --hbaseSnapshotSourceDir=$MIGRATION_DESTINATION_DIRECTORY/data \
    --snapshotName=SNAPSHOT_NAME \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/staging \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/temp \
    --maxNumWorkers=$(expr 3 \* $CLUSTER_NUM_NODES) \
    --region=$REGION

更改下列內容:

  • TABLE_NAME:要匯入的 HBase 資料表名稱。Schema 轉換工具會使用這個名稱做為新的 Bigtable 資料表名稱。系統不支援新的資料表名稱。
  • SNAPSHOT_NAME:您為要匯入的資料表快照指派的名稱

執行指令後,這項工具會將 HBase 快照還原至 Cloud Storage 值區,然後啟動匯入工作。視快照大小而定,還原快照程序可能需要幾分鐘才能完成。

匯入時請注意下列幾點:

  • 為了改善資料載入的效能,務必設定 maxNumWorkers。 這個值可以協助您確保有足夠的運算能力在合理的時間內完成匯入工作,但不至於多到癱瘓 Bigtable 執行個體。
    • 如果 Bigtable 執行個體未用於其他工作負載,請將 Bigtable 執行個體中的節點數乘以 3,然後將該數字用於 maxNumWorkers
    • 如果您在匯入 HBase 資料的同時,也使用執行個體處理其他工作負載,請適當調低 maxNumWorkers 的值。
  • 使用預設工作站類型。
  • 匯入期間,您應該監控 Bigtable 執行個體的 CPU 使用率。如果整個 Bigtable 執行個體的 CPU 使用率太高,您可能需要額外新增節點。叢集最多可能需要 20 分鐘,才能提供額外節點的效能益處。

如要進一步瞭解如何監控 Bigtable 執行個體,請參閱「監控」。

Snappy 壓縮資料表

如要匯入 Snappy 壓縮資料表,您需要在 Dataflow 管道中使用自訂容器映像檔。您用來將壓縮資料匯入 Bigtable 的自訂容器映像檔,提供 Hadoop 原生壓縮程式庫支援。如要使用 Dataflow Runner v2,您必須具備 Apache Beam SDK 2.30.0 以上版本,且 Java 適用的 HBase 用戶端程式庫必須為 2.3.0 以上版本。

如要匯入 Snappy 壓縮資料表,請執行與未壓縮資料表相同的指令,但須新增下列選項:

    --enableSnappy=true

驗證 Bigtable 中的匯入資料

如要驗證匯入的資料,請執行 sync-table 工作。這項sync-table工作會計算 Bigtable 中資料列範圍的雜湊,然後與您先前計算的 HashTable 輸出內容比對。

如要執行 sync-table 工作,請在指令殼層中執行下列指令:

java -jar $IMPORT_JAR sync-table  \
    --runner=dataflow \
    --project=$PROJECT_ID \
    --bigtableInstanceId=$INSTANCE_ID \
    --bigtableTableId=TABLE_NAME \
    --outputPrefix=$MIGRATION_DESTINATION_DIRECTORY/sync-table/output-TABLE_NAME-$(date +"%s") \
    --stagingLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/staging \
    --hashTableOutputDir=$MIGRATION_DESTINATION_DIRECTORY/hashtable/TABLE_NAME \
    --tempLocation=$MIGRATION_DESTINATION_DIRECTORY/sync-table/dataflow-test/temp \
    --region=$REGION

TABLE_NAME 替換為您要匯入的 HBase 資料表名稱。

sync-table 工作完成後,請開啟「Dataflow Job details」(Dataflow 工作詳細資料) 頁面,並查看工作中的「Custom counters」(自訂計數器) 區段。如果匯入工作成功匯入所有資料,ranges_matched 的值會是某個值,而 ranges_not_matched 的值則為 0。

Dataflow 自訂計數器

如果 ranges_not_matched 顯示值,請開啟「記錄」頁面,選擇「工作人員記錄」,然後依「範圍不符」篩選。這些記錄的機器可讀輸出內容會儲存在 Cloud Storage,位置是您在 sync-table outputPrefix 選項中建立的輸出目的地。

Dataflow 工作站記錄

您可以再次嘗試匯入作業,或是編寫指令碼來讀取輸出檔案,以判斷發生不符情況的位置。輸出檔案中的每一行都是不相符範圍的序列化 JSON 記錄

Route 會寫入 Bigtable

驗證叢集中每個資料表的資料後,您可以設定應用程式,將所有流量都導向 Bigtable,然後淘汰 HBase 執行個體。

遷移作業完成後,您可以刪除 HBase 執行個體上的快照。

後續步驟