Apache Beam / Google Dataflow最后一步只运行一次

时间:2018-04-10 16:52:26

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的问题,我们的数据流可能会出现类似的问题 - 由于GCS中的每个文件分别触发了数据流执行,我们遇到了'Load jobs per table per day' BigQuery limit +文件桶中的文件。

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

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

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

不确定您是否可以采用相同的方法,