第二次使用 Dataflow 从 Big Query 中提取数据的问题 [apache beam]

Posted

技术标签:

【中文标题】第二次使用 Dataflow 从 Big Query 中提取数据的问题 [apache beam]【英文标题】:Issues in Extracting data from Big Query from second time using Dataflow [ apache beam ] 【发布时间】:2020-04-29 13:41:41 【问题描述】:

我需要使用 Dataflow 从 BigQuery 表中提取数据并写入 GCS 存储桶。 数据流是使用 apache beam (Java) 构建的。数据流从 BigQuery 中提取并首次完美写入 GCS。

但是,当第一个管道成功执行后启动第二个数据流以从同一个表中提取数据时,它不会从 Big Query 中提取任何数据。我在堆栈驱动程序日志中看到的唯一错误是

Blockquote "请求失败,代码 409,由于 IOExceptions 执行了 0 次重试,由于状态码不成功执行了 0 次重试,HTTP 框架说可以重试请求,(负责重试的调用者):https://www.googleapis.com/bigquery/v2/projects/dataflow-begining/jobs"

我用于提取的示例代码是

 pipeline.apply("Extract from BQ", BigQueryIO.readTableRows().fromQuery("SELECT * from bq_test.employee"))

感谢任何帮助

【问题讨论】:

您在 Dataflow 的出路过程中是否进行了任何特殊的转换或业务逻辑?我问的原因是因为您没有必须使用 Dataflow。您可以使用 SQL 进行处理,然后调用 BigQuery 的导出 API 将表直接转储到 GCS。它也可以通过不使用 Dataflow 为您节省资金。另外 - 您是否知道在管道中使用 SQL 查询从 BigQuery 读取会产生费用?不要使用SELECT *。请改用from(TableReference) 而不是fromQuery(SQL) 【参考方案1】:

我以前在使用模板时看到过这种情况。根据文档here,在 Usage with templates 部分:

在模板中使用 read() 或 readTableRows() 时,需要 指定 BigQueryIO.Read.withTemplateCompatibility()。指定这个 不推荐在非模板管道中使用,因为它有点 性能较低。

withTemplateCompatibility 部分:

使用新的模板兼容源实现。这个实现 与重复模板调用兼容。

如果是这样,您应该使用:

pipeline.apply("Extract from BQ", BigQueryIO
        .readTableRows()
        .withTemplateCompatibility()
        .fromQuery("SELECT * from bq_test.employee"))

【讨论】:

以上是关于第二次使用 Dataflow 从 Big Query 中提取数据的问题 [apache beam]的主要内容,如果未能解决你的问题,请参考以下文章

在 Dataflow 的云存储桶上哪里可以找到这个 pubsub 订阅?

将数据流从 Google Cloud Storage 流式传输到 Big Query

第二次Scrum冲刺

OO第二次博客

写入 Big Query 时数据流作业失败 - 未找到 JSON 文件

无法遵循加密的 Big-Query 教程文档