將資料從 HBase 遷移到 Cloud Bigtable

本文說明將資料從 Apache HBase 叢集遷移到 Google Cloud Platform (GCP) 上的 Cloud Bigtable 叢集的考量事項和過程。

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

效能影響

在一般工作負載下,Cloud Bigtable 提供非常容易預測的效能。當一切順暢時,視叢集使用的儲存空間類型而定,您可以預期 Cloud Bigtable 叢集中的每個節點都能達到以下的效能。

儲存空間類型 讀取   寫入 掃描
SSD 每秒 10,000 個資料列 @ 6 ms 每秒 10,000 個資料列 @ 6 ms 220 MB/秒
HDD 每秒 500 個資料列 @ 200 ms 每秒 10,000 個資料列 @ 50 ms 180 MB/秒

清單中顯示的預估值是依據每一資料列包含 1 KB 的資料。預估值也反映出唯讀或唯寫工作負載。混合讀取和寫入的工作負載效能將會有所不同。

這些效能值是參考準則,但不是鐵則。每一節點效能可能因工作負載及要求和回覆的一般大小而異。如需詳細資訊,請參閱瞭解 Cloud Bigtable 效能

Cloud Bigtable 結構定義設計

設計 Cloud Bigtable 結構定義與設計關聯資料庫結構定義並不相同。設計結構定義之前,請查閱設計結構定義中提出的概念。

您也必須讓結構定義保持在建議的大小限制之下。作為指導原則,請保持單一資料列小於 100 MB,單一值則小於 10 MB。在某些情況下,您需要儲存的值可能很大。儲存大型值會影響效能,因為取出大型值需要時間和記憶體。請依個案評估這些情況。

驗證及授權

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

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

儘管 Cloud Bigtable 允許您控制執行個體等級的存取,但它並不提供資料表等級的精細控制。提供資料表等級精細度的方法之一,是將具有類似存取模式的資料表聚集在 Cloud Bigtable 執行個體上。但這方法代表您可能需要使用多個 Cloud Bigtable 執行個體來遷移所有的資料表。

詳情請參閱存取權控管

將 HBase 遷移到 Cloud Bigtable

若要將資料從 HBase 遷移到 Cloud Bigtable,請將資料以一系列的 Hadoop 序列檔案的形式匯出。這是 HBase 使用的檔案格式,由二進制鍵/值組合組成。

若要將 HBase 資料表遷移到 Cloud Bigtable,請執行以下步驟︰

  1. 從 HBase 收集詳細資料。
  2. 匯出 HBase 資料表到序列檔案。
  3. 將序列檔案移至 Cloud Storage。
  4. 使用 Cloud Dataflow,將序列檔案匯入 Cloud Bigtable。
  5. 驗證移動是否正確。

規劃遷移︰從 HBase 收集詳細資料

若要為遷移作準備,請由現有的 HBase 叢集收集以下資訊,因為建立目的地資料表時需要這份資訊。

  • 資料表清單
  • 列數
  • 儲存格數目
  • 資料欄系列詳細資料 (包括生存時間、最大版本數)

有一個簡單的方法可以收集來源資料表的詳細資料,就是使用下列指令碼,會將結果留在 HDFS 上︰

#!/usr/bin/env bash
# Table Name is the Source HBase Table Name
TABLENAME="$1"
# Export Directory will be located on HDFS
EXPORTDIR="$2"
hadoop fs -mkdir -p ${EXPORTDIR}
hbase shell << EOQ
describe ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-schema.json
hbase shell << EOQ
get_splits ${TABLENAME}
EOQ | hadoop fs -put - ${EXPORTDIR}/${TABLENAME}-splits.txt

將 HBase 資料表匯出至 Cloud Storage

瞭解要遷移的 HBase 資料表的基本資訊後,您需要將資料表匯出到序列檔案,然後將它們移動到 Cloud Storage。採取行動遷移任何線上資料之前,請執行下列步驟,以確認您的叢集符合存取 GCP 的必要條件︰

  • 安裝 Cloud Storage 連接器

    如果您想使用 distcp 遷移線上資料,必須安裝和設定 Cloud Storage 連接器。首先,確定管理欲遷移資料的 HDFS 檔案系統。其次,決定 Hadoop 叢集中哪一個用戶端節點可以存取該檔案系統。最後,在用戶端節點上安裝連接器。如需詳細的安裝步驟,請參閱安裝 Cloud Storage 連接器

  • 安裝 Cloud SDK

    若要使用 distcpgsutil 遷移資料,請在要啟動遷移的 Hadoop 叢集用戶端節點上安裝 Cloud SDK。如需詳細的安裝步驟,請參閱 Cloud SDK 文件

將 HBase 資料表匯出至 HDFS

其次,將您想要遷移的 HBase 資料表匯出至 Hadoop 叢集內的某處。假設您的 HBase 資料表名稱是 [MY_NEW_TABLE]。目標目錄位於 HDFS 中您的使用者目錄下。請使用下列指令,將 HBase 資料表以序列檔案的形式匯出︰

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
hadoop fs -mkdir -p ${EXPORTDIR}
MAXVERSIONS=2147483647
cd ${HBASE_HOME}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export my-new-table \
    /user/hbase-${TABLENAME} \
    -export ${MAXVERSIONS}
bin/hbase org.apache.hadoop.hbase.mapreduce.Export \
    -Dmapred.output.compress=true \
    -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
    -DRAW_SCAN=true \
    -Dhbase.client.scanner.caching=100 \
    -Dmapred.map.tasks.speculative.execution=false \
    -Dmapred.reduce.tasks.speculative.execution=false \
    ${TABLENAME} ${EXPORTDIR} ${MAXVERSIONS}

將序列檔案從 HDFS 遷移至 Cloud Storage

下一步驟是把序列檔案移動到 Cloud Storage 值區。您可以選擇適當的選項,將序列檔案移動到 Cloud Storage 上:Transfer Appliance、distcpgsutil 或 Storage 轉移服務,具體則視資料的大小、檔案數量、資料來源及可用頻寬而定。

使用 Transfer Appliance

在下列情況下,請使用 Transfer Appliance 遷移您的資料︰

  • 您希望按照時間表控制傳出的頻寬。
  • 資料大小大於 20 TB。

選擇此選項時,並不需要向 Google 購買或佈建額外的網路。端對端傳輸時間 (設備運送時間、解除凍結等) 平均為 100 Mbps。

若要使用 Transfer Appliance 移動資料,請將序列檔案複製到該設備,然後將檔案運送回 Google。Google 會把資料載入到 GCP 上。如需詳細資訊,請參閱此 Transfer Appliance 文件

使用 distcp

在下列情況下,請使用 distcp 遷移您的資料︰

  • 可用於遷移的頻寬超過 100 Mbps。
  • 來源 Hadoop 環境上可以安裝 Cloud Storage 連接器和 Cloud SDK。
  • 可管理新的 Hadoop 工作以進行資料遷移。
  • 資料大小小於 20 TB。

若要使用 distcp 移動資料,請使用配置了 Cloud Storage 連接器的 Hadoop 叢集用戶端節點提交 MapReduce 工作,將序列檔案複製到 Cloud Storage︰

hadoop distcp hdfs://[NAMENODE]:[NAMENODE_PORT]/[SOURCE_DIRECTORY] \
gs://[BUCKET]/DESTINATION_DIRECTORY]

使用 gsutil

在下列情況下,請使用 gsutil 遷移您的資料︰

  • 可用於遷移的頻寬超過 100 Mbps。
  • 來源 Hadoop 環境上可以安裝 Cloud SDK。
  • 不可管理新的 Hadoop 工作以進行資料遷移。
  • 資料大小小於 10 TB。

若要使用 gsutil 移動資料,請使用 Hadoop 叢集用戶端節點啟動資料遷移︰

TABLENAME="my-new-table"
EXPORTDIR=/usr/[USERNAME]/hbase-${TABLENAME}-export
gsutil -m cp -r  ${EXPORTDIR} gs://[BUCKET]

使用 Storage 移轉服務

在下列情況下,請使用 Storage 移轉服務遷移您的資料︰

  • 資料來源是 Amazon S3 值區、HTTP/HTTPS 位置或 Cloud Storage 值區。
  • 資料大小小於 10 TB。

Storage 移轉服務具有的選項功能,可使資料來源和資料接收器之間的資料移轉和同步更加容易。舉例來說,您可以執行下列操作:

  • 安排一次性移轉或週期性移轉操作。
  • 如果來源中沒有對應的物件,則刪除目的地值區現有的物件。
  • 在移轉作業完成後刪除來源物件。
  • 使用進階篩選器,依據檔案建立日期、檔案名稱篩選器,以及您偏好的匯入資料時間,安排從資料來源到資料接收器的週期性同步。

如需詳細資訊,請參閱 Storage 移轉服務文件。

建立目的地資料表

下一步是在 Cloud Bigtable 中建立目的地資料表。

首先,使用 gcloud 指令列工具安裝 Cloud Bigtable 用戶端工具 cbt

gcloud components update
gcloud components install cbt

其次,在 Cloud Bigtable 中建立一張資料表,具有依據您先前的發現成果而產生合適資料欄系列。

建立目的地資料表時,請使用現有的拆分預先將其分割。這樣可以改善大量載入的效能。

例如,如果您發現現有的拆分是︰

'15861', '29374', '38173', '180922', '203294', '335846', '641111', '746477', '807307', '871053', '931689', '1729462', '1952670', '4356485', '4943705', '5968738', '6917370', '8993145', '10624362', '11309714', '12056747', '12772074', '14370672', '16583264', '18835454', '21194008', '22021148', '23702800', '25532516', '55555555'

然後為您的使用者帳戶建立一個 cbt 工具的預設專案和 Cloud Bigtable 執行個體,如下所示:

$ cat > ${HOME}/.cbtrc << EOF
project = [YOUR-GCP-PROJECT]
instance = [BIGTABLE-INSTANCE-NAME]
EOF

在目的地資料表中建立這些拆分:

cbt -instance my-instance createtable my-new-table \
splits=15861,29374,38173,180922,203294,335846,641111,746477,807307,871053,931689,\
1729462,1952670,4356485,4943705,5968738,6917370,8993145,10624362,11309714,\
12056747,12772074,14370672,16583264,18835454,21194008,22021148,23702800,\
5532516,55555555

在目的地資料表中建立資料欄系列,以符合您先前發現的資料欄系列。例如,如果您發現有兩個資料欄系列 cf1cf2,請在 Cloud Bigtable 上建立資料欄系列 cf1,如下所示:

cbt createfamily my-new-table cf1

建立資料欄系列 cf2,如下所示:

cbt createfamily my-new-table cf2

建立資料欄系列後,更新每個資料欄系列的垃圾收集政策是很重要的,其中包括該資料欄系列中值的最長壽命和最大版本數。即使您已經使用 HBase 對 HBase 資料表的預設設定,還是必須這麼做,因為 Cloud Bigtable 的原生工具使用的預設設定與 HBase 不同。

cbt setgcpolicy [TABLE] [FAMILY] ( maxage=[D]| maxversions=[N] )

使用 Cloud Dataflow,將 HBase 資料匯入 Cloud Bigtable

有兩種方法可以將資料匯入 Cloud Bigtable。如需詳細資訊,請參閱 Cloud Bigtable 文件中的匯入序列檔案

請記住以下提示:

  • 為了改善資料載入的效能,務必設定 maxNumWorkers。這個值可以協助您確保有足夠的運算能力在合理的時間內完成匯入工作,但不至於多到癱瘓 Cloud Bigtable 叢集。

  • 匯入期間,您應該監控 Cloud Bigtable 叢集的 CPU 使用率。Cloud Bigtable 監控文件的 CPU 使用率章節提供有關這個主題的詳細訊息。如果整個 Cloud Bigtable 叢集的 CPU 使用率太高,您可能需要額外新增節點。叢集可能要費時 20 分鐘才能提供額外節點的效能益處。

如需監控 Cloud Bigtable 執行個體的詳細資訊,請參閱監控 Cloud Bigtable 執行個體

驗證 Cloud Bigtable 內的匯入資料

若要驗證匯入的資料,可以使用幾種不同的檢查︰

  • 檢查列數是否匹配。 Cloud Dataflow 工作會報告總列數。這個值必須與來源 HBase 資料表的列數匹配。
  • 用特定列查詢進行抽查。 您可以從來源資料表挑選一組特定的資料列索引鍵,然後在目的地資料表上查詢,以確認它們互相匹配︰
cbt lookup [destination-table] [rowkey1]
cbt lookup [destination-table] [rowkey2]

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
將 Hadoop 遷移至 GCP