從 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 中,大部分基元都是以相同的方式呈現,不過仍有以下幾個例外情況:

  • DateTimestamp 會轉換為 DateTime 物件
  • UUID 已轉換為 String
  • Varint 已轉換為 BigDecimal

Apache Cassandra 也原生支援較為複雜的類型,例如 TupleListSetMap。 這個管道目前不支援 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

管道處理 Set 的方式與 List 相同,但會新增後置字串來表示儲存格中為索引鍵或資料值。

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. 在「工作名稱」欄位中,輸入專屬工作名稱。
  4. 選用:如要使用區域端點,請從下拉式選單中選取值。預設區域為 us-central1

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

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

gcloud

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

gcloud dataflow jobs run JOB_NAME \
    --gcs-location gs://dataflow-templates-REGION_NAME/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: 您要使用的範本版本

    您可以使用下列值:

  • REGION_NAME: 您要部署 Dataflow 工作的地區,例如 us-central1
  • BIGTABLE_PROJECT_ID:Bigtable 所在的專案 ID
  • BIGTABLE_INSTANCE_ID:Bigtable 執行個體 ID
  • BIGTABLE_TABLE_ID:Bigtable 資料表名稱
  • :Apache Cassandra 主機清單;如果提供多部主機,請按照操作說明逸出逗號CASSANDRA_HOSTS
  • 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-LOCATION/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 工作的專案 ID Google Cloud
  • JOB_NAME: 您選擇的不重複工作名稱
  • VERSION: 您要使用的範本版本

    您可以使用下列值:

  • LOCATION: 您要部署 Dataflow 工作的地區,例如 us-central1
  • BIGTABLE_PROJECT_ID:Bigtable 所在的專案 ID
  • BIGTABLE_INSTANCE_ID:Bigtable 執行個體 ID
  • BIGTABLE_TABLE_ID:Bigtable 資料表名稱
  • :Apache Cassandra 主機清單;如果提供多部主機,請按照操作說明逸出逗號CASSANDRA_HOSTS
  • CASSANDRA_KEYSPACE:資料表所在的 Apache Cassandra 鍵空間
  • CASSANDRA_TABLE:需要遷移的 Apache Cassandra 資料表

後續步驟