從 Google Cloud代管的 HBase 遷移

本頁說明從Google Cloud 服務 (例如 Dataproc 或 Compute Engine) 上代管的 Apache HBase 叢集遷移至 Bigtable 時,使用者必須留意哪些事項和必須執行哪些程序。

如需從外部 Apache HBase 環境離線遷移至 Bigtable 的指引,請參閱「從 HBase 離線遷移資料至 Bigtable」。如要進行線上遷移,請參閱「從 HBase 複製到 Bigtable」。

為何要從 HBase on Google Cloud 遷移至 Bigtable

選擇這項遷移路徑的原因可能包括:

注意事項

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

Bigtable 結構定義設計

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

準備和測試

遷移資料前,請務必瞭解 HBase 和 Bigtable 的差異。您應花一些時間瞭解如何設定連線,將應用程式連線至 Bigtable。此外,您可能也想在遷移前執行系統和功能測試,驗證應用程式或服務。

遷移步驟

如要將資料從 HBase 遷移至 Bigtable,請建立 HBase 快照,然後直接從 HBase 叢集將資料匯入 Bigtable。這些步驟適用於單一 HBase 叢集,接下來幾節會詳細說明。

  1. 停止將寫入作業傳送至 HBase。
  2. 在 Bigtable 中建立目的地資料表。
  3. 建立 HBase 快照並匯入 Bigtable。
  4. 驗證匯入的資料。
  5. 更新應用程式,將讀取和寫入作業傳送至 Bigtable。

圖片

事前準備

  1. 安裝 Google Cloud CLI 或使用 Cloud Shell

  2. 建立 Cloud Storage bucket,以儲存驗證輸出資料。在您打算執行 Dataproc 工作的位置建立值區。

  3. 找出要遷移的 Hadoop 叢集。您必須在 Dataproc 1.x 叢集上執行遷移作業,該叢集必須與 HBase 叢集的 Namenode 和 Datanode 建立網路連線。請記下 HBase 叢集的 ZooKeeper Quorum 位址Namenode URI,這些是遷移指令碼的必要資訊。

  4. 建立 Dataproc 叢集 1.x 版,並與來源 HBase 叢集位於相同網路。您可以使用這個叢集執行匯入和驗證工作。

  5. 建立 Bigtable 執行個體,用來儲存新資料表。Bigtable 執行個體中至少有一個叢集,也必須與 Dataproc 叢集位於相同區域。範例:us-central1

  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/2.6.0/bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar

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

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

    wget BIGTABLE_MAPREDUCE_URL
    

    BIGTABLE_MAPREDUCE_URL 替換為工具 Maven 存放區中提供的最新 shaded-byo JAR 網址。檔案名稱類似於 https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-hbase-1.x-mapreduce/2.6.0/bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar

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

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

    #Google Cloud
    
    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    
    ##Cloud Bigtable
    
    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    
    ##Dataproc
    
    export DATAPROC_CLUSTER_ID=DATAPROC_CLUSTER_NAME
    
    #Cloud Storage
    
    export BUCKET_NAME="gs://BUCKET_NAME"
    export STORAGE_DIRECTORY="$BUCKET_NAME/hbase-migration"
    
    #HBase
    
    export ZOOKEEPER_QUORUM=ZOOKEPER_QUORUM
    export ZOOKEEPER_PORT=2181
    export ZOOKEEPER_QUORUM_AND_PORT="$ZOOKEEPER_QUORUM:$ZOOKEEPER_PORT"
    export MIGRATION_SOURCE_NAMENODE_URI=MIGRATION_SOURCE_NAMENODE_URI
    export MIGRATION_SOURCE_TMP_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/tmp
    export MIGRATION_SOURCE_DIRECTORY=${MIGRATION_SOURCE_NAMENODE_URI}/hbase
    
    #JAR files
    
    export TRANSLATE_JAR=TRANSLATE_JAR
    export MAPREDUCE_JAR=MAPREDUCE_JAR
    
    

    將預留位置替換為遷移作業的值。

    Google Cloud:

    • PROJECT_ID:Bigtable 執行個體所在的 Google Cloud 專案
    • :包含要執行匯入和驗證作業的 Dataproc 叢集。REGION

    《Bigtable:

    • BIGTABLE_INSTANCE_ID:要匯入資料的 Bigtable 執行個體 ID

    Dataproc:

    • DATAPROC_CLUSTER_ID:Dataproc 叢集的 ID,用於執行匯入和驗證工作

    Cloud Storage:

    • BUCKET_NAME:您儲存快照的 Cloud Storage bucket 名稱

    HBase:

    • ZOOKEEPER_QUORUM:工具將連線的 ZooKeeper 主機,格式為 host1.myownpersonaldomain.com
    • MIGRATION_SOURCE_NAMENODE_URI:HBase 叢集 NameNode 的 URI,格式為 hdfs://host1.myownpersonaldomain.com:8020

    JAR 檔案

    • TRANSLATE_JAR:從 Maven 下載的 bigtable hbase tools JAR 檔案名稱和版本號碼。該值看起來應該會類似 bigtable-hbase-1.x-tools-2.6.0-jar-with-dependencies.jar
    • MAPREDUCE_JAR:從 Maven 下載的 bigtable hbase mapreduce JAR 檔案名稱和版本號碼。該值看起來應該會類似 bigtable-hbase-1.x-mapreduce-2.6.0-shaded-byo-hadoop.jar
  9. (選用) 如要確認變數是否設定正確,請執行 printenv 指令,查看所有環境變數。

停止將寫入作業傳送至 HBase

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

在 Bigtable 中建立目的地資料表

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

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

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

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

java \
 -Dgoogle.bigtable.project.id=$PROJECT_ID \
 -Dgoogle.bigtable.instance.id=$BIGTABLE_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 替換為正規運算式 (例如「.*」),擷取要建立的所有資料表,然後只執行一次指令。

建立 HBase 資料表快照並匯入 Bigtable

針對每個要遷移至 Bigtable 的資料表,完成下列步驟。

  1. 執行下列指令:

    echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
    

    更改下列內容:

    • HBASE_TABLE_NAME:要遷移至 Bigtable 的 HBase 資料表名稱。
    • HBASE_SNAPSHOT_NAME:新快照的專屬名稱
  2. 執行下列指令來匯入快照:

    gcloud dataproc jobs submit hadoop \
        --cluster $DATAPROC_CLUSTER_ID \
        --region $REGION \
        --project $PROJECT_ID \
        --jar $MAPREDUCE_JAR \
        -- \
        import-snapshot \
        -Dgoogle.bigtable.project.id=$PROJECT_ID \
        -Dgoogle.bigtable.instance.id=$BIGTABLE_INSTANCE_ID \
        HBASE_SNAPSHOT_NAME \
        $MIGRATION_SOURCE_DIRECTORY \
        BIGTABLE_TABLE_NAME \
        $MIGRATION_SOURCE_TMP_DIRECTORY
    

    更改下列內容:

    • HBASE_SNAPSHOT_NAME:您為要匯入的資料表快照指派的名稱
    • BIGTABLE_TABLE_NAME:要匯入的 Bigtable 資料表名稱

    執行指令後,這項工具會還原來源叢集上的 HBase 快照,然後匯入該快照。還原快照程序可能需要幾分鐘才會完成,實際時間取決於快照的大小。

匯入資料時,可使用下列額外選項:

  • 為緩衝的突變子要求設定以用戶端為準的逾時 (預設為 600000 毫秒)。請參閱以下範例:

    -Dgoogle.bigtable.rpc.use.timeouts=true
    -Dgoogle.bigtable.mutate.rpc.timeout.ms=600000
    
  • 建議您考慮採用延遲時間限制,減少匯入批次工作對其他工作負載的影響。請針對遷移應用實例測試節流。請參閱以下範例:

    -Dgoogle.bigtable.buffered.mutator.throttling.enable=true
    -Dgoogle.bigtable.buffered.mutator.throttling.threshold.ms=100
    
  • 修改讀取單一 HBase 區域的地圖工作數量 (每個區域預設為 2 個地圖工作)。請參閱以下範例:

    -Dgoogle.bigtable.import.snapshot.splits.per.region=3
    
  • 將其他 MapReduce 設定設為屬性。請參閱以下範例:

    -Dmapreduce.map.maxattempts=4
    -Dmapreduce.map.speculative=false
    -Dhbase.snapshot.thread.pool.max=20
    

匯入時請注意下列事項:

  • 為改善資料載入的效能,請務必提供足夠的 Dataproc 叢集工作站,以便平行執行地圖匯入工作。根據預設,n1-standard-8 Dataproc 工作站會執行八項匯入工作。有足夠的工作站可確保匯入工作有足夠的運算能力,能在合理的時間內完成,但不會多到癱瘓 Bigtable 執行個體。
    • 如果 Bigtable 執行個體未用於其他工作負載,請將 Bigtable 執行個體中的節點數乘以 3,然後除以 8 (使用 n1-standard-8 dataproc 工作站)。將結果做為 Dataproc 工作站數量。
    • 如果您在匯入 HBase 資料的同時,也將執行個體用於其他工作負載,請減少 Dataproc 工作站的值,或增加 Bigtable 節點數量,以符合工作負載的需求。
  • 匯入期間,您應該監控 Bigtable 執行個體的 CPU 使用率。如果整個 Bigtable 執行個體的 CPU 使用率太高,您可能需要額外新增節點。新增節點後,CPU 使用率會立即提升,但叢集可能要費時 20 分鐘才能達到最佳效能。

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

驗證 Bigtable 中的匯入資料

接著,比較來源和目的地資料表的雜湊值,驗證資料遷移作業,確保遷移資料的完整性。首先,請執行 hash-table 工作,在來源資料表上產生資料列範圍的雜湊。接著,執行 sync-table 工作,計算並比對 Bigtable 與來源的雜湊,完成驗證。

  1. 如要建立用於驗證的雜湊,請針對要遷移的每個資料表執行下列指令:

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
      --jar $MAPREDUCE_JAR \
      -- \
      hash-table \
      -Dhbase.zookeeper.quorum=$ZOOKEEPER_QUORUM_AND_PORT \
      HBASE_TABLE_NAME \
      $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/
    

    HBASE_TABLE_NAME 替換為您建立快照的 HBase 資料表名稱。

  2. 在命令殼層中執行下列指令:

    gcloud dataproc jobs submit hadoop \
      --project $PROJECT_ID \
      --cluster $DATAPROC_CLUSTER_ID \
      --region $REGION \
     --jar $MAPREDUCE_JAR \
     -- \
     sync-table \
     --sourcezkcluster=$ZOOKEEPER_QUORUM_AND_PORT:/hbase \
     --targetbigtableproject=$PROJECT_ID \
     --targetbigtableinstance=$BIGTABLE_INSTANCE_ID \
     $STORAGE_DIRECTORY/HBASE_TABLE_NAME/hash-output/ \
     HBASE_TABLE_NAME \
     BIGTABLE_TABLE_NAME
    

    更改下列內容:

    • HBASE_TABLE_NAME:要匯入資料的 HBase 表格名稱
    • BIGTABLE_TABLE_NAME:要匯入資料的 Bigtable 資料表名稱

如要啟用來源與目標之間的分散式雜湊範圍同步,可以視需要將 --dryrun=false 新增至指令。

sync-table 工作完成後,工作計數器會顯示在執行工作的 Google Cloud 控制台中。如果匯入工作成功匯入所有資料,HASHES_MATCHED 的值會是某個值,而 HASHES_NOT_MATCHED 的值則為 0。

如果 HASHES_NOT_MATCHED 顯示值,您可以在偵錯模式下重新執行 sync-table,發出差異範圍和儲存格層級詳細資料,例如 Source missing cellTarget missing cellDifferent values。如要啟用偵錯模式,請設定 --properties mapreduce.map.log.level=DEBUG。作業執行完畢後,請使用 Cloud Logging 搜尋 jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable" 這個運算式,查看有差異的儲存格。

您可以再次嘗試匯入工作,或設定 dryrun=false,使用 SyncTable 同步處理來源和目標表格。請先檢查 HBase SyncTable 和其他設定選項,然後再繼續操作。

Cloud Logging 中的 SyncTable 結果

更新應用程式,以便將讀取和寫入作業傳送至 Bigtable

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

遷移完成後,即可刪除快照。

後續步驟