【问题标题】:Dataflow job uses same BigQuery job ID when deploying using a staged template multiple times?多次使用暂存模板进行部署时,Dataflow 作业使用相同的 BigQuery 作业 ID?
【发布时间】: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


【解决方案1】:

根据附加描述,听起来这可能是没有按照指示使用withTemplateCompatability()的情况?

与模板一起使用

在模板中使用 read() 或 readTableRows() 时,需要指定 BigQueryIO.Read.withTemplateCompatibility()。不建议在非模板管道中指定它,因为它的性能稍差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2018-07-29
    • 2021-04-02
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多