從 Apache Cassandra 遷移至 Bigtable 的範本

從 Apache Cassandra 遷移至 Bigtable 的範本會將 Apache Cassandra 中的資料表複製到 Bigtable。這個範本不僅可以減少調整設定的需求,也能盡量按照 Cassandra 中的資料表結構將資料複製到 Bigtable。

從 Apache Cassandra 遷移至 Bigtable 的範本適用於下列用途:

  • 在可接受短暫停機時間的情況下遷移 Apache Cassandra 資料庫。
  • 定期將 Cassandra 資料表複製到 Bigtable,以便提供全球服務。

管道相關規定

  • 執行管道前,目標 Bigtable 資料表必須已存在。
  • Dataflow 工作站和 Apache Cassandra 節點之間必須建立網路連線。

類型轉換

從 Apache Cassandra 遷移至 Bigtable 的範本會自動將 Apache Cassandra 資料類型轉換為 Bigtable 的資料類型。

在 Bigtable 和 Apache Cassandra 中,大部分基元都是以相同的方式呈現,不過下列基元是以不同方式呈現:

  • Date 和 Timestamp 會轉換為 DateTime 物件
  • 「UUID」已轉換為「String」
  • 「Varint」已轉換為「BigDecimal」

Apache Cassandra 也原生支援較為複雜的類型,例如 Tuple、List、Set 和 Map。 這個管道不支援 Tuples,因為 Apache Beam 中沒有相對應的類型。

舉例來說,您在 Apache Cassandra 中可以有名為「mylist」的 List 類型資料欄,以及如同下列資料表中的資料值:

列 mylist
1 (a,b,c)

管道會將清單資料欄展開為三個不同的資料欄 (在 Bigtable 中稱為「資料欄限定詞」)。 資料欄名稱為「mylist」,但管道會附加清單中項目的索引,例如「mylist[0]」。

列 mylist[0] mylist[1] mylist[2]
1 a b c

管道會以與清單相同的方式處理集合,但會新增後置字元,表示儲存格是鍵還是值。

列 mymap
1 {"first_key":"first_value","another_key":"different_value"}

轉換後,資料表會如下所示:

列 mymap[0].key mymap[0].value mymap[1].key mymap[1].value
1 first_key first_value another_key different_value

主要索引鍵轉換

在 Apache Cassandra 中,主鍵是使用資料定義語言定義。也就是簡單主要索引鍵、複合式主要索引鍵,或是含有叢集資料欄的複合式主要索引鍵。Bigtable 支援手動建立資料列索引鍵的功能 (按照位元組陣列的字母順序排列)。管道會自動收集金鑰類型相關資訊,並根據最佳做法,以多個值為基礎建構資料列鍵。

範本參數

必要參數

  • cassandraHosts:以半形逗號分隔的 Apache Cassandra 節點主機清單。
  • cassandraKeyspace:資料表所在的 Apache Cassandra 鍵空間。
  • cassandraTable:要複製的 Apache Cassandra 資料表。
  • bigtableProjectId:與 Bigtable 執行個體相關聯的 Google Cloud 專案 ID。
  • bigtableInstanceId:要將 Apache Cassandra 資料表複製到其中的 Bigtable 執行個體 ID。
  • bigtableTableId:要將 Apache Cassandra 資料表複製到的 Bigtable 資料表名稱。

選用參數

  • cassandraPort:用於連線至節點上 Apache Cassandra 的 TCP 通訊埠。預設值為 9042。
  • defaultColumnFamily:Bigtable 資料表的資料欄系列名稱。預設值為 default。
  • rowKeySeparator:用於建構資料列索引鍵的分隔符。預設值為 #。
  • splitLargeRows:這個旗標用於啟用將大型資料列分割成多個 MutateRows 要求的作業。請注意,如果將大型資料列分割成多個 API 呼叫,資料列的更新作業就不是不可分割。。
  • writetimeCassandraColumnSchema:將 Cassandra 寫入時間複製到 Bigtable 的結構定義 GCS 路徑。產生這個結構定義的指令是 cqlsh -e "select json * from system_schema.columns where keyspace_name='$CASSANDRA_KEYSPACE' and table_name='$CASSANDRA_TABLE'`" > column_schema.json。將 $WRITETIME_CASSANDRA_COLUMN_SCHEMA 設為 GCS 路徑,例如 gs://$BUCKET_NAME/column_schema.json。然後將結構定義上傳至 GCS:gcloud storage cp column_schema.json $WRITETIME_CASSANDRA_COLUMN_SCHEMA。需要 Cassandra 2.2 以上版本才能支援 JSON。
  • setZeroTimestamp:如果沒有 Cassandra 寫入時間,這個標記會將 Bigtable 儲存格時間戳記設為 0。如果未設定這個標記,預設行為是將 Bigtable 資料格時間戳記設為範本複製時間 (即現在)。

執行範本

控制台

  1. 前往 Dataflow 的「Create job from template」(依據範本建立工作) 頁面。
  2. 前往「依範本建立工作」
  3. 在「Job name」(工作名稱) 欄位中,輸入專屬工作名稱。
  4. 選用:如要使用區域端點,請從下拉式選單中選取值。預設區域為 us-central1。

    如需可執行 Dataflow 工作的區域清單,請參閱「Dataflow 位置」。

  5. 從「Dataflow template」(Dataflow 範本) 下拉式選單中,選取「Cassandra to Cloud Bigtable」(從 Cassandra 遷移至 Cloud Bigtable) 範本。
  6. 在提供的參數欄位中輸入參數值。
  7. 按一下「Run Job」(執行工作)。

gcloud

在殼層或終端機中執行範本:

gcloud dataflow jobs run JOB_NAME \
    --gcs-location gs://dataflow-templates/VERSION/Cassandra_To_Cloud_Bigtable \
    --region REGION_NAME \
    --parameters \
bigtableProjectId=BIGTABLE_PROJECT_ID,\
bigtableInstanceId=BIGTABLE_INSTANCE_ID,\
bigtableTableId=BIGTABLE_TABLE_ID,\
cassandraHosts=CASSANDRA_HOSTS,\
cassandraKeyspace=CASSANDRA_KEYSPACE,\
cassandraTable=CASSANDRA_TABLE

更改下列內容:

  • JOB_NAME:您選擇的不重複工作名稱
  • VERSION:您要使用的範本版本

    您可以使用下列值:

    • latest,使用範本的最新版本,該版本位於 bucket 中非依日期命名的上層資料夾:gs://dataflow-templates/latest/
    • 版本名稱,例如 2023-09-12-00_RC00,可使用特定版本的範本,該範本會以巢狀結構存放在 bucket 中相應的依日期命名上層資料夾中:gs://dataflow-templates/
  • REGION_NAME:您要部署 Dataflow 工作的區域,例如 us-central1
  • BIGTABLE_PROJECT_ID:Bigtable 所在的專案 ID
  • BIGTABLE_INSTANCE_ID:Bigtable 執行個體 ID
  • BIGTABLE_TABLE_ID:Bigtable 資料表名稱
  • CASSANDRA_HOSTS:Apache Cassandra 主機清單;如果提供多部主機,請按照說明逸出逗號
  • CASSANDRA_KEYSPACE:資料表所在的 Apache Cassandra 鍵空間
  • CASSANDRA_TABLE:需要遷移的 Apache Cassandra 資料表

API

如要使用 REST API 執行範本,請傳送 HTTP POST 要求。如要進一步瞭解 API 和授權範圍,請參閱 projects.templates.launch。

POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/templates:launch?gcsPath=gs://dataflow-templates/VERSION/Cassandra_To_Cloud_Bigtable
{
   "jobName": "JOB_NAME",
   "parameters": {
       "bigtableProjectId": "BIGTABLE_PROJECT_ID",
       "bigtableInstanceId": "BIGTABLE_INSTANCE_ID",
       "bigtableTableId": "BIGTABLE_TABLE_ID",
       "cassandraHosts": "CASSANDRA_HOSTS",
       "cassandraKeyspace": "CASSANDRA_KEYSPACE",
       "cassandraTable": "CASSANDRA_TABLE"
   },
   "environment": { "zone": "us-central1-f" }
}

更改下列內容:

  • PROJECT_ID:您要執行 Dataflow 工作的 Google Cloud 專案 ID
  • JOB_NAME:您選擇的不重複工作名稱
  • VERSION:您要使用的範本版本

    您可以使用下列值:

    • latest,使用範本的最新版本,該版本位於 bucket 中非依日期命名的上層資料夾:gs://dataflow-templates/latest/
    • 版本名稱,例如 2023-09-12-00_RC00,可使用特定版本的範本,該範本會以巢狀結構存放在 bucket 中相應的依日期命名上層資料夾中:gs://dataflow-templates/
  • LOCATION:您要部署 Dataflow 工作的區域,例如 us-central1
  • BIGTABLE_PROJECT_ID:Bigtable 所在的專案 ID
  • BIGTABLE_INSTANCE_ID:Bigtable 執行個體 ID
  • BIGTABLE_TABLE_ID:Bigtable 資料表名稱
  • CASSANDRA_HOSTS:Apache Cassandra 主機清單;如果提供多部主機,請按照說明逸出逗號
  • CASSANDRA_KEYSPACE:資料表所在的 Apache Cassandra 鍵空間
  • CASSANDRA_TABLE:需要遷移的 Apache Cassandra 資料表

後續步驟