如何防止作业重新启动期间 GCP Dataflow 数据丢失(Flex 模板 SpanenrToBigQuery)

问题描述 投票:0回答:1

我将

change stream
数据从 Spanner 传输到 Big Query 中。我使用默认的
--template-file-gcs-location=gs://dataflow-templates-us-central1/latest/flex/Spanner_Change_Streams_to_BigQuery
Flex 模板。

情况

  1. 我的 Spanner 架构有时会发生变化
  2. 当我的 Spanner 架构发生更改时,我会手动对 BigQuery 架构进行更改
  3. 然后我必须取消我的数据流管道。因为
    Spanner_Change_Streams_to_BigQuery
    模板使用 Splittable DoFunc 我无法耗尽
  4. 现在,我在关闭当前管道和启动新管道之间发生数据丢失

可能的解决方案

  • 使用水印指标启动新管道

不确定这是如何以及是否是正确的方法。当我必须传播架构更改时,是否有更简单的方法来防止任何数据丢失?


我考虑使用

  const result = await dataflow.projects.jobs.getMetrics(request);
来获取所有水印,但最终我得到了模板的每个阶段的多个水印。

这是正确的做法吗?如果是这样,我如何启动一个具有多个阶段、基于多个水印的新 Flex 模板?

DataWatermark F174 1697517770000000
{
  name: {
    origin: 'dataflow/v1b3',
    name: 'DataWatermark',
    context: { execution_step: 'F174' }
  },
  scalar: 1697517770000000,
  updateTime: '2023-10-17T04:43:06.711Z'
}
DataWatermark F174 1697517770000000
{
  name: {
    origin: 'dataflow/v1b3',
    name: 'DataWatermark',
    context: { execution_step: 'F175', tentative: 'true' }
  },
  scalar: 1697517770000000,
  updateTime: '2023-10-17T04:43:06.711Z'
}
DataWatermark F175 1697517770000000
{
  name: {
    origin: 'dataflow/v1b3',
    name: 'DataWatermark',
    context: { execution_step: 'F175' }
  },
  scalar: 1697517770000000,
  updateTime: '2023-10-17T04:43:06.711Z'
}
DataWatermark F175 1697517770000000
google-cloud-platform google-bigquery google-cloud-dataflow apache-beam google-cloud-spanner
1个回答
0
投票

事实证明,我的设置太复杂,无法正确理解幕后发生的事情。

关键见解。 Spanner 架构更改不会自动传播到 BigQuery,但如果在更改 Spanner 之前对 BQ 架构进行更改,则不会丢失数据:

操作顺序:

  1. 在 BigQuery 中对数据流管道写入的数据集/表执行
    add column
    语句
  2. 无需更改数据流管道(确保已启用
    use_runner_v2
    streaming
# I use these parameters in my `gcloud dataflow flex-template run` command
...
experiments=use_runner_v2,\
enableStreamingEngine=true,\
...
  1. 现在对 Spanner 进行
    add_column
    更改
  2. 部署写入新 Spanner 列的代码
  3. 数据将自动从 Spanner 流向 BQ,无需任何干预或重新启动数据流管道
© www.soinside.com 2019 - 2024. All rights reserved.