本页介绍了使用 Datastream 从 Dataflow Datastream to BigQuery 模板迁移到 Datastream 内置 BigQuery 复制解决方案时的最佳实践。
准备工作
本页面中的说明假定:
- 您熟悉 Docker 并已安装该工具。
- 您知道如何从 GitHub 等服务克隆代码库。
- 您已了解如何在 Datastream 中运行数据流。
- 您已安装 Google Cloud CLI。
迁移工具包概览
Datastream BigQuery 迁移工具包是由 Google Cloud提供的开源软件。借助该工具包,您可以迁移 Dataflow Datastream 到 BigQuery 模板,但也可以在从其他流水线迁移时使用该工具包,如以下从其他流水线迁移部分所述。
如需使用该工具包迁移 BigQuery 表,您需要执行以下步骤:
- 使用 BigQuery 作为目标位置创建、启动和暂停 Datastream 数据流。
- 对需要迁移的每个 BigQuery 表运行迁移。
- 恢复数据流。
该工具包具有以下功能:
- 使用 Datastream discover API 检索源表架构。
- 根据检索到的架构创建与 Datastream 兼容的 BigQuery 表。
- 提取要迁移的 BigQuery 表的架构,以确定必要的数据类型转换。
- 将原始表中的所有现有行复制到新表中,包括适当的列类型转换。
如需详细了解该工具包的结构和它使用的参数,请参阅该工具包的 README.md
文件。
设置迁移工具包
如需使用 Docker 运行迁移工具包,请执行以下步骤:
克隆代码库并切换到该代码库所在的目录:
git clone https://github.com/GoogleCloudPlatform/datastream-bigquery-migration-toolkit && cd datastream-bigquery-migration-toolkit
构建映像:
docker build -t migration-service .
使用 Google Cloud CLI 凭据进行身份验证:
docker run -ti \ --name gcloud-config migration-service gcloud auth application-default login
设置 Google Cloud 项目属性:
docker run -ti --volumes-from gcloud-config migration-service \ gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您的 Google Cloud项目的标识符。
从 Dataflow 迁移到 Datastream 内置解决方案
开始流式传输,然后立即暂停。这样,Datastream 便可以在迁移开始之前捕获其捕获更改的位置。
清空 Datastream 和 Dataflow 流水线:
- 暂停现有的 Cloud Storage 目标数据流。
- 检查数据流的总延迟时间指标,并至少等待当前延迟时间,以确保将所有正在处理的事件写入目的地。
- 排空 Dataflow 作业。
执行迁移:
在
dry_run
模式下运行迁移。在dry_run
模式下,您可以生成用于复制数据的CREATE TABLE
DDL 语句和 SQL 语句,而无需执行它们:docker run -v output:/output -ti --volumes-from gcloud-config \ migration-service python3 ./migration/migrate_table.py dry_run \ --project-id PROJECT_ID \ --stream-id STREAM_ID \ --datastream-region STREAM_REGION \ --source-schema-name SOURCE_SCHEMA_NAME \ --source-table-name SOURCE_TABLE_NAME \ --bigquery-source-dataset-name BIGQUERY_SOURCE_DATASET_NAME \ --bigquery-source-table-name BIGQUERY_SOURCE_TABLE_NAME
替换以下内容:
- PROJECT_ID: Google Cloud项目的唯一标识符。
- STREAM_ID:BigQuery 目标数据流的唯一标识符。
- STREAM_REGION:数据流的位置,例如
us-central1
。 - SOURCE_SCHEMA_NAME:来源架构的名称。
- SOURCE_TABLE_NAME:来源表的名称。
- BIGQUERY_SOURCE_DATASET_NAME:现有 BigQuery 数据集的名称。
- BIGQUERY_SOURCE_TABLE_NAME:现有 BigQuery 表的名称。
检查
output/create_target_table
和output/copy_rows
下的.sql
文件。以下是将在您的项目中执行的 SQL 命令: Google Clouddocker run -v output:/output -ti migration-service find output/create_target_table \ -type f -print -exec cat {} \;
docker run -v output:/output -ti migration-service find output/copy_rows \ -type f -print -exec cat {} \;
如需执行 SQL 命令,请在
full
模式下运行迁移。借助full
模式,您可以在 BigQuery 中创建表,并复制现有 BigQuery 表中的所有行:docker run -v output:/output -ti --volumes-from gcloud-config \ migration-service python3 ./migration/migrate_table.py full \ --project-id PROJECT_ID \ --stream-id STREAM_ID \ --datastream-region STREAM_REGION \ --source-schema-name SOURCE_SCHEMA_NAME \ --source-table-name SOURCE_TABLE_NAME \ --bigquery-source-dataset-name BIGQUERY_SOURCE_DATASET_NAME \ --bigquery-source-table-name BIGQUERY_SOURCE_TABLE_NAME
恢复暂停的数据流。
打开 Google Cloud Logs Explorer,然后使用以下查询查找 Datastream 日志:
resource.type="datastream.googleapis.com/Stream" resource.labels.stream_id=STREAM_ID
查找以下日志,其中
%d
是一个数字:Completed writing %d records into..
此日志表明,新数据流已成功将数据加载到 BigQuery 中。只有在有 CDC 数据可加载时,此按钮才会显示。
从其他流水线迁移
借助该工具包,您还可以从其他流水线迁移到 Datastream 内置的 BigQuery 解决方案。该工具包可以使用 dry_run
模式根据源数据库架构为与 Datastream 兼容的 BigQuery 表生成 CREATE TABLE
DDL:
docker run -v output:/output -ti --volumes-from gcloud-config \
migration-service python3 ./migration/migrate_table.py dry_run \
--project-id PROJECT_ID \
--stream-id STREAM_ID \
--datastream-region STREAM_REGION \
--source-schema-name SOURCE_SCHEMA_NAME \
--source-table-name SOURCE_TABLE_NAME \
--bigquery-source-dataset-name BIGQUERY_SOURCE_DATASET_NAME \
--bigquery-source-table-name BIGQUERY_SOURCE_TABLE_NAME
由于 BigQuery 表架构可能会有所不同,因此很难提供用于复制行的通用 SQL 语句。您可以使用源表 DDL 目录 (output/source_table_ddl
) 和目标表 DDL 目录 (output/create_target_table
) 中的架构,针对源列创建包含适当转换的 SQL 语句。
以下是可供您使用的 SQL 语句格式示例:
INSERT INTO DESTINATION_TABLE (DESTINATION_COLUMN1, DESTINATION_COLUMN2...)
SELECT SOURCE_COLUMN1, SOURCE_COLUMN2
FROM SOURCE_TABLE;
替换以下内容:
- DESTINATION_TABLE:BigQuery 中目标表的名称。
- DESTINATION_COLUMN:目标表中的列名称。
- SOURCE_COLUMN:来源表中的列名称。
- SOURCE_TABLE:来源表的名称。
限制
该工具包存在以下限制:
- 现有 BigQuery 表和新 BigQuery 表中的列名称需要匹配(忽略元数据列)。如果您应用了会更改现有表中列名称的 Dataflow 用户定义函数 (UDF)(例如,通过添加前缀或更改大小写),则迁移会失败。
- 不支持跨区域和跨项目迁移。
- 迁移是按表进行的。
- 仅支持 Oracle 和 MySQL 来源。