【发布时间】:2020-10-21 00:34:56
【问题描述】:
我正在尝试部署一个 Dataflow 作业,该作业从 BigQuery 读取并按固定时间表写入 Cassandra。模板代码是使用 Apache Beam 和 Dataflow 库以 Java 编写的。我已将模板暂存到 Google Cloud Storage 上,并配置了 Cloud Scheduler 实例以及用于触发 Dataflow 模板的 Cloud 函数。我正在为所有 Beam 和 BigQuery 依赖项使用最新版本。
但是,我发现在使用相同的暂存模板部署作业时,BigQuery 提取作业似乎总是使用相同的作业 ID,这会导致日志中显示 409 失败。 BigQuery 查询作业似乎成功了,因为查询作业 ID 附加了唯一的后缀,而提取作业 ID 使用相同的前缀,但没有后缀。
我考虑了两种替代解决方案:要么使用 crontab 将管道直接部署在计算引擎实例上以直接部署模板,要么调整云函数以按计划执行与 Dataflow 管道相同的任务。理想情况下,如果有一种解决方案可以更改 Dataflow 作业中的提取作业 ID,那将是一个更简单的解决方案,但我不确定这是否可能?此外,如果这不可能,是否有更优化的替代解决方案?
【问题讨论】:
-
这里很难做出任何断言,因为没有足够的细节,但是没有硬编码参考应该没问题。提取是作为 BigQueryIO 用于读取的某些特定用途的副产品发生的,还是管道明确定义它等?
-
作为管道步骤的一部分的 BigQueryIO.readTableRows() 调用导致提取发生。查询作业在提取作业之前运行,该作业写入临时表,然后提取作业将结果提取为 TableRow 格式。它发生在转换 TableRow 的 ParDo 函数之前,但 ParDo 步骤从未执行,因为读取步骤失败。
标签: java google-bigquery google-cloud-dataflow apache-beam