在加入并将它们导出到 GCS 之前,如何等待 BigQuery 上的异步表写入?

Posted

技术标签:

【中文标题】在加入并将它们导出到 GCS 之前,如何等待 BigQuery 上的异步表写入?【英文标题】:How do I wait for asynchronous table writes on BigQuery before joining and exporting them to GCS? 【发布时间】:2019-10-26 16:40:24 【问题描述】:

我有一个在 Google Cloud Platform 上运行的系统,它的工作原理如下:

首先,有一个云函数是由特定存储桶上的数据上传触发的。然后,它组织这些数据并生成“.json”形式的处理器作业,并将其保存到另一个存储桶中。

还有第二个云函数——系统的核心——由这个“.json”上传触发。然后,它处理数据并将输出结果作为单个表写入 BigQuery 数据集。

我还编写了另一个云函数,用于连接此 BigQuery 数据集中的所有表并将其导出到 Google Cloud Storage 存储桶中的 CSV。

因此问题出现了:只有将所有表都插入 BigQuery 后,我才能调用最后一个聚合云函数。我该如何管理?怎样才能在所有表都存在后才触发此功能?

【问题讨论】:

不容易回答。我只想了解您的架构的一些细节:为什么要生成不同的 JSON,独立处理它们,然后将所有数据合并到同一个表中?您的加载作业是否具有不同的架构?您不能将它们加载到单个作业中吗?其他问题:您是否知道每次 JSON 的数量以及您每次将运行的加载作业的数量?或者它是可变的?你知道最长的加载作业持续时间吗? 由于计算能力的原因,我生成了不同的 JSON。如果云函数仅在一个实例中处理所需的所有内容,它将无法处理大量数据。因此,我划分了必须计算的内容,并且有多个云函数实例并行处理数据。是的,我事先知道生成的 JSON 的数量,并且我还创建了一个带有汇总信息(例如作业数量)的 overview.json - 但请注意这可能会很棘手,因为函数可能会失败并且不会在 BigQuery 中创建表.工作持续时间是可变的。 【参考方案1】:

没有简单的方法,但我有两个建议

如果您没有时间限制并且可以按顺序处理文件,您可以这样做 第一个函数进行拆分并构建overview.json 文件。然后用in参数调用第二个函数,overwien.json文件中第一个json的名称 第二个函数根据参数处理JSON文件的数据,写入BQ。然后使用overview.json 文件中的下一个条目调用第二个函数。如果是最后一个条目,调用第三个函数 处理完所有数据后调用第三个函数

它有效,但你失去了并行化的力量。

另一种解决方案是使用 Datastore/Firestore。而要做到这一点 第一个函数进行拆分并在 Datastore/Firestore 中写入一个条目,其中包含要处理的 JSON 文件列表及其状态为“未处理”。 第二个函数在 json 上传时触发(如今天),处理数据,将它们写入 BigQuery,将 Datastore/Firestore 中 JSON 文件的状态更新为“已处理”,然后调用第三个函数 第三个函数查询 Datastore/Firestore 并检查所有要处理的 json 文件是否处于“已处理”状态。如果否,则退出该功能。如果是,则执行该函数中的处理。

我更喜欢这个解决方案。您必须注意最后一个函数的竞争条件(如果您愿意,我可以为您提供处理它的提示),并且您需要有一个全局构建 ID 以不混合 2 个不同执行的状态更新(如果有 2并发执行第一个函数)

更新

对于比赛条件,我通常会这样做

创建一个空间(表或集合)来记录某些内容。在您的情况下,它可以与 Firestore 中的概览文档一起使用。 第3个函数,当它检查了所有的部分都已经处理完毕后,检查第3个函数是否正在运行 如果是,退出 如果否,请在表/集合中(在您的情况下为 Firestore)写入由函数生成的唯一 ID(例如 UUID) 第三次再次读取表/集合(在您的情况下是在 Firestore 中)并检查保存的 ID 是否是它自己的 ID 如果是,则处理 如果没有,请退出

它并不完美,但它可以涵盖大多数情况。

【讨论】:

我也更喜欢第二种解决方案。我也在考虑在 BigQuery 表中写入状态。您对此有何看法,尤其是在将其与 Firestore 解决方案进行比较时?有什么优点/缺点吗?我想要关于那个(比赛条件)的提示,谢谢!关于全局构建 ID,它在第一个 Cloud Function 中开发 ID 分配功能的路线图。 Bigquery 也是一种解决方案。一切都取决于你想做什么。想要对每个零件的加工时长进行分析和统计?是的,BigQuery 是进行分析、聚合和统计的合适场所。但是,如果您不需要,我强烈推荐 Firestore:更快更便宜。对于比赛条件,我更新了我的答案

以上是关于在加入并将它们导出到 GCS 之前,如何等待 BigQuery 上的异步表写入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GCS 中的 csv 随机样本导出到 BigQuery

如何限制从 bigquery 导出到 gcs 的文件大小?

如何将 Google Analytics 数据导出到 Google GCS 存储桶或 BigQuery?

如何通过GCS将GA360表从Big query导出到雪花作为json文件而不丢失数据?

每 5 分钟上传到 GCS 的文本文件如何将它们上传到 BigQuery?

将 XLS 文件从 GCS 导入 BigQuery