本頁面說明將資料從 Apache HBase 叢集遷移至Google Cloud中的 Bigtable 執行個體時,使用者必須留意哪些事項和必須執行哪些程序。
本頁面所述程序需要您將應用程式離線。如要在不停機的情況下遷移,請參閱「從 HBase 複製到 Bigtable」中的線上遷移指南。
開始遷移前,請考量效能影響、Bigtable 結構定義設計、驗證與授權方法,以及 Bigtable 特徵集。
遷移前注意事項
本節建議您在開始遷移前,先檢視並思考幾件事。
效能
在一般工作負載下,Bigtable 的效能相當穩定,容易預測。遷移資料前,請務必瞭解影響 Bigtable 效能的因素。
Bigtable 結構定義設計
在多數情況下,您可以在 Bigtable 中使用與 HBase 相同的結構定義設計。如要變更結構定義,或用途有所變更,請先詳閱「設計結構定義」中的概念,再遷移資料。
驗證及授權
設計 Bigtable 的存取控管機制前,請先查看現有的 HBase 驗證和授權程序。
Bigtable 使用 Google Cloud的標準驗證機制和 Identity and Access Management 提供存取控管,因此您需要將 HBase 的現有授權轉換為 IAM。您可以將為 HBase 提供存取控管機制的現有 Hadoop 群組,對應至不同的服務帳戶。
Bigtable 可讓您在專案、執行個體和資料表層級控管存取權。如需詳細資訊,請參閱存取控制。
停機時間規定
本頁所述的遷移方法,會讓應用程式在遷移期間離線。如果貴公司無法承受遷移至 Bigtable 期間的停機時間,請參閱「從 HBase 複製到 Bigtable」中的線上遷移指南。
將 HBase 遷移至 Bigtable
如要將資料從 HBase 遷移至 Bigtable,請將每個資料表的 HBase 快照匯出至 Cloud Storage,然後將資料匯入 Bigtable。這些步驟適用於單一 HBase 叢集,後續幾節將詳細說明。
- 停止將寫入作業傳送至 HBase 叢集。
- 建立 HBase 叢集資料表的快照。
- 將快照檔案匯出至 Cloud Storage。
- 計算雜湊並匯出至 Cloud Storage。
- 在 Bigtable 建立目的地資料表。
- 將 HBase 資料從 Cloud Storage 匯入 Bigtable。
- 驗證匯入的資料。
- 將寫入作業轉送至 Bigtable。
事前準備
建立 Cloud Storage bucket,用於儲存快照。在您打算執行 Dataflow 工作的位置建立 bucket。
建立 Bigtable 執行個體,用於儲存新資料表。
找出要匯出的 Hadoop 叢集。您可以直接在 HBase 叢集上執行遷移工作,也可以在與 HBase 叢集的 Namenode 和 Datanode 建立網路連線的獨立 Hadoop 叢集上執行。
在 Hadoop 叢集中的每個節點,以及啟動工作的來源主機上,安裝並設定 Cloud Storage 連接器。如需詳細的安裝步驟,請參閱「安裝 Cloud Storage 連接器」。
在可連線至 HBase 叢集和 Bigtable 專案的主機上,開啟指令殼層。您將在這裡完成後續步驟。
取得結構定義翻譯工具:
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.20.2/bigtable-hbase-1.x-tools-2.20.2-jar-with-dependencies.jar。如要找出網址或手動下載 JAR,請按照下列步驟操作:
- 前往存放區。
- 按一下最新版本號碼。
- 找出
JAR with dependencies file(通常位於頂端)。 - 按一下滑鼠右鍵並複製網址,或點選下載檔案。
取得匯入工具:
wget BIGTABLE_BEAM_IMPORT_URL將
BIGTABLE_BEAM_IMPORT_URL替換為工具 Maven 存放區中最新shaded JAR的網址。檔案名稱類似於https://repo1.maven.org/maven2/com/google/cloud/bigtable/bigtable-beam-import/2.20.2/bigtable-beam-import-2.20.2-shaded.jar。如要找出網址或手動下載 JAR,請按照下列步驟操作:
- 前往存放區。
- 按一下最新版本編號。
- 點選「下載」。
- 將滑鼠游標懸停在 shaded.jar 上。
- 按一下滑鼠右鍵並複製網址,或點選下載檔案。
請設定下列環境變數:
#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 執行個體 IDREGION:Bigtable 執行個體中,其中一個叢集所在的區域。範例:northamerica-northeast2CLUSTER_NUM_NODES:: Bigtable 執行個體中的節點數量TRANSLATE_JAR:從 Maven 下載的bigtable hbase toolsJAR 檔案名稱和版本號碼。這個值與bigtable-hbase-1.x-tools-2.20.2-jar-with-dependencies.jar類似。IMPORT_JAR:從 Maven 下載的bigtable-beam-importJAR 檔案名稱和版本號碼。這個值與bigtable-beam-import-2.20.2-shaded.jar類似。BUCKET_NAME:儲存快照的 Cloud Storage bucket 名稱ZOOKEEPER_QUORUM:工具要連線的 zookeeper 主機,格式為host1.myownpersonaldomain.comMIGRATION_SOURCE_DIRECTORY:HBase 主機上存放要遷移資料的目錄,格式為hdfs://host1.myownpersonaldomain.com:8020/hbase
(選用) 如要確認變數設定正確,請執行
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 資料表名稱。結構定義翻譯工具會將這個名稱用於新的 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 資料表名稱。結構定義翻譯工具會將這個名稱用於新的 Bigtable 資料表。不支援新的資料表名稱。SNAPSHOT_NAME:您為要匯入的資料表快照指派的名稱
執行指令後,工具會將 HBase 快照還原至 Cloud Storage bucket,然後啟動匯入工作。視快照大小而定,還原快照的程序可能需要幾分鐘才能完成。
匯入時,請留意下列提示:
- 為提升資料載入效能,請務必設定
maxNumWorkers。這個值有助於確保匯入工作有足夠的運算能力,可在合理的時間內完成,但不會過多,以免 Bigtable 執行個體不堪負荷。- 如果您未將 Bigtable 執行個體用於其他工作負載,請將 Bigtable 執行個體中的節點數量乘以 3,並將該數字用於
maxNumWorkers。 - 如果您在匯入 HBase 資料時,同時將執行個體用於其他工作負載,請適當降低
maxNumWorkers的值。
- 如果您未將 Bigtable 執行個體用於其他工作負載,請將 Bigtable 執行個體中的節點數量乘以 3,並將該數字用於
- 使用預設 worker 類型。
- 匯入期間,請監控 Bigtable 執行個體的 CPU 使用率。如果 Bigtable 執行個體的 CPU 使用率過高,可能需要新增節點。叢集最多可能需要 20 分鐘,才能提供額外節點的效能優勢。
如要進一步瞭解如何監控 Bigtable 執行個體,請參閱「監控」。
Snappy 壓縮資料表
如要匯入 Snappy 壓縮資料表,您必須在 Dataflow 管道中使用自訂容器映像檔。您用來將壓縮資料匯入 Bigtable 的自訂容器映像檔,提供 Hadoop 原生壓縮程式庫支援。您必須使用 Apache Beam SDK 2.30.0 以上版本,才能使用 Dataflow Runner 第 2 版,且必須使用 2.3.0 以上版本的 Java HBase 用戶端程式庫。
如要匯入 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。

如果 ranges_not_matched 顯示值,請開啟「Logs」(記錄) 頁面,選擇「Worker Logs」(工作站記錄),然後依「Mismatch on range」(範圍不符) 篩選。這些記錄的機器可讀輸出內容會儲存在 Cloud Storage 中,位置是您在同步資料表 outputPrefix 選項中建立的輸出目的地。

您可以再次嘗試匯入工作,或編寫指令碼來讀取輸出檔案,判斷不相符的位置。輸出檔案中的每一行都是不相符範圍的序列化 JSON 記錄。
將寫入作業轉送至 Bigtable
驗證叢集中每個資料表的資料後,您可以設定應用程式,將所有流量轉送至 Bigtable,然後淘汰 HBase 執行個體。
遷移作業完成後,您可以刪除 HBase 執行個體上的快照。
後續步驟
- 進一步瞭解 Cloud Storage。