從 Google Cloud代管的 HBase 遷移
本頁說明從Google Cloud 服務 (例如 Dataproc 或 Compute Engine) 上代管的 Apache HBase 叢集遷移至 Bigtable 時,使用者必須留意哪些事項和必須執行哪些程序。
如需從外部 Apache HBase 環境離線遷移至 Bigtable 的指引,請參閱「從 HBase 離線遷移資料至 Bigtable」。如要進行線上遷移,請參閱「從 HBase 複製到 Bigtable」。
為何要從 HBase on Google Cloud 遷移至 Bigtable
選擇這項遷移路徑的原因可能包括:
- 您可以保留目前部署的用戶端應用程式,只變更連線設定。
- 您的資料仍會保留在 Google Cloud 生態系統中。
- 您可以繼續使用 HBase API。適用 Java 的 Cloud Bigtable HBase 用戶端是 適用 Java 的 Apache HBase 程式庫的完整支援擴充功能。
- 您希望使用代管服務儲存資料,享有相關優勢。
注意事項
本節提供幾項建議,供您在開始遷移前參考。
Bigtable 結構定義設計
在大多數情況下,您可以在 Bigtable 中使用與 HBase 相同的結構定義設計。如要變更結構定義或使用案例,請先查閱設計結構定義中提出的概念,再遷移資料。
準備和測試
遷移資料前,請務必瞭解 HBase 和 Bigtable 的差異。您應花一些時間瞭解如何設定連線,將應用程式連線至 Bigtable。此外,您可能也想在遷移前執行系統和功能測試,驗證應用程式或服務。
遷移步驟
如要將資料從 HBase 遷移至 Bigtable,請建立 HBase 快照,然後直接從 HBase 叢集將資料匯入 Bigtable。這些步驟適用於單一 HBase 叢集,接下來幾節會詳細說明。
- 停止將寫入作業傳送至 HBase。
- 在 Bigtable 中建立目的地資料表。
- 建立 HBase 快照並匯入 Bigtable。
- 驗證匯入的資料。
- 更新應用程式,將讀取和寫入作業傳送至 Bigtable。
事前準備
建立 Cloud Storage bucket,以儲存驗證輸出資料。在您打算執行 Dataproc 工作的位置建立值區。
找出要遷移的 Hadoop 叢集。您必須在 Dataproc 1.x 叢集上執行遷移作業,該叢集必須與 HBase 叢集的 Namenode 和 Datanode 建立網路連線。請記下 HBase 叢集的 ZooKeeper Quorum 位址和 Namenode URI,這些是遷移指令碼的必要資訊。
建立 Dataproc 叢集 1.x 版,並與來源 HBase 叢集位於相同網路。您可以使用這個叢集執行匯入和驗證工作。
建立 Bigtable 執行個體,用來儲存新資料表。Bigtable 執行個體中至少有一個叢集,也必須與 Dataproc 叢集位於相同區域。範例:
us-central1
取得結構定義翻譯工具:
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,請按照下列步驟操作:
- 前往存放區。
- 按一下「瀏覽」即可查看存放區檔案。
- 按一下最新版本號碼。
- 找出
JAR with dependencies file
(通常位於頂端)。 - 你可以按一下滑鼠右鍵並複製網址,也可以點選下載檔案。
取得 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,請按照下列步驟操作:
- 前往存放區。
- 按一下最新版本號碼。
- 按一下「已下載的內容」。
- 將滑鼠游標懸停在 shaded-byo-hadoop.jar 上。
- 你可以按一下滑鼠右鍵並複製網址,也可以點選下載檔案。
設定下列環境變數:
#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
。
(選用) 如要確認變數是否設定正確,請執行
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 的資料表,完成下列步驟。
執行下列指令:
echo "snapshot 'HBASE_TABLE_NAME', 'HBASE_SNAPSHOT_NAME'" | hbase shell -n
更改下列內容:
HBASE_TABLE_NAME
:要遷移至 Bigtable 的 HBase 資料表名稱。HBASE_SNAPSHOT_NAME
:新快照的專屬名稱
執行下列指令來匯入快照:
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 與來源的雜湊,完成驗證。
如要建立用於驗證的雜湊,請針對要遷移的每個資料表執行下列指令:
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 資料表名稱。在命令殼層中執行下列指令:
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 cell
、Target missing cell
或 Different values
。如要啟用偵錯模式,請設定 --properties mapreduce.map.log.level=DEBUG
。作業執行完畢後,請使用 Cloud Logging 搜尋 jsonPayload.class="org.apache.hadoop.hbase.mapreduce.SyncTable"
這個運算式,查看有差異的儲存格。
您可以再次嘗試匯入工作,或設定 dryrun=false
,使用 SyncTable 同步處理來源和目標表格。請先檢查 HBase SyncTable 和其他設定選項,然後再繼續操作。
更新應用程式,以便將讀取和寫入作業傳送至 Bigtable
驗證叢集中每個資料表的資料後,您可以設定應用程式,將所有流量都導向 Bigtable,然後淘汰 HBase 叢集。
遷移完成後,即可刪除快照。