【问题标题】:Apache Beam / Google Dataflow Final step to run only onceApache Beam / Google Dataflow 最后一步只运行一次
【发布时间】:2018-04-17 21:18:47
【问题描述】:

我有一个管道,我可以在其中下载数千个文件,然后转换它们并将它们作为 CSV 存储在谷歌云存储上,然后在 bigquery 上运行加载作业。

这很好用,但是当我运行数千个加载作业(每个下载的文件一个)时,我达到了导入配额。

我已经更改了我的代码,因此它列出了存储桶中的所有文件并运行一项作业,并将所有文件作为作业的参数。

所以基本上我只需要运行一次最后一步,即所有数据都已处理完毕。我想我可以使用 groupBy 转换来确保所有数据都已处理,但我想知道是否有更好/更标准的方法。

【问题讨论】:

  • 为什么要写回 GCS,而不是直接写到 BigQuery?
  • 出于成本原因
  • 你能详细说明一下吗?
  • 使用流 api 或插入语句插入不是免费的。但是通过 gcs 加载数据是。我们每天要插入数亿行,所以价格差距很大。
  • Dataflow 仅在流模式下运行时使用流插入。这听起来像是在做一个批处理管道,它实际上只是在后台运行(免费)BQ 加载作业。

标签: java google-cloud-dataflow apache-beam


【解决方案1】:

如果我正确理解了您的问题,我们可能在其中一个数据流中遇到了类似的问题 - 我们遇到了'Load jobs per table per day' BigQuery limit,因为数据流执行是针对 GCS 中的每个文件分别触发的,并且我们有 1000 多个文件在桶里。

最后,我们的问题的解决方案非常简单 - 我们修改了 TextIO.read 转换以使用通配符而不是单个文件名

i.e TextIO.read().from("gs://<BUCKET_NAME>/<FOLDER_NAME>/**")

通过这种方式,只执行了一个数据流作业,因此写入 BigQuery 的所有数据都被视为单个加载作业,尽管存在多个来源。

不确定您是否可以应用相同的方法。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2021-05-10
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多