Google cloud platform 在加入并导出到GCS之前,如何等待BigQuery上的异步表写入?

Google cloud platform 在加入并导出到GCS之前,如何等待BigQuery上的异步表写入?,google-cloud-platform,google-bigquery,google-cloud-functions,Google Cloud Platform,Google Bigquery,Google Cloud Functions,我有一个系统运行在谷歌云平台上,它的工作原理如下: 首先,有一个云功能,由特定bucket上的数据上传触发。然后,它将这些数据组织起来,并生成作为“.json”的处理器作业,这些作业保存到另一个存储桶中 还有第二个云函数——系统的核心——由这个“.json”上传触发。然后,它处理数据并将输出结果作为单个表写入BigQuery数据集中 我还编写了另一个云函数,它连接这个BigQuery数据集中的所有表,并将其导出到Google云存储桶中的CSV 因此问题出现了:我只能在所有表都插入BigQuery

我有一个系统运行在谷歌云平台上,它的工作原理如下:

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

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

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


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

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

  • 若您并没有时间限制,并且可以按顺序处理文件,那个么您可以这样做
    • 第一个函数进行拆分并构建
      overview.json
      文件。然后用in参数调用第二个函数,
      overvien.json
      文件中第一个json的名称
    • 第二个函数根据参数处理JSON文件的数据,并将其写入BQ。然后使用
      overview.json
      文件中的下一个条目调用第二个函数。如果是最后一个条目,调用第三个函数
    • 第三个函数在处理完所有数据后调用
它可以工作,但是你失去了并行化的能力

  • 另一种解决方案是使用Datastore/Firestore。要做到这一点
    • 第一个函数在Datastore/Firestore中进行拆分并写入一个条目,其中包含要处理的JSON文件列表及其状态为“未处理”
    • 第二个函数在json上传时触发(如今天),处理数据,将其写入BigQuery,将Datastore/Firestore中json文件的状态更新为“已处理”,并调用第三个函数
    • 第三个函数查询Datastore/Firestore,并检查要处理的所有json文件是否都处于“已处理”状态。如果否,则退出该函数。如果是,则执行此功能中的处理
我更喜欢这个解决方案。您必须注意最后一个函数的竞争条件(如果您愿意,我可以为您提供处理它的提示),并且您需要有一个全局构建ID,以避免混合两个不同执行的状态更新(如果第一个函数有两个并发执行)

更新

对于比赛条件,我通常执行此操作

  • 创建一个空间(表或集合),用于记录某些内容。在您的情况下,它可以与Firestore中的概述文档一起使用
  • 第三个功能,检查所有零件是否已处理后,检查第三个功能是否正在运行
    • 如果是,退出
    • 如果否,则在表/集合中(在您的案例中,在Firestore中)写入由函数生成的唯一ID(例如UUID)
  • 第三个再次读取表/集合(在您的案例中,在Firestore中),并检查保存的ID是否为其自己的ID
    • 如果是,流程是什么
    • 如果没有,退出

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

答案并不简单。我只想了解您的体系结构的一些细节:为什么要生成不同的JSON,独立处理它们,然后将所有数据合并到同一个表中?加载作业是否具有不同的模式?不能在单个作业中加载它们?其他问题:您是否知道每次运行的JSON数量和加载作业数量?或者它是可变的?你知道加载作业的最长持续时间吗?由于计算能力的原因,我生成了不同的JSON。如果云函数只在一个实例中处理所需的所有内容,那么它将无法处理数据量。因此,我划分了必须计算的内容,并且有多个云函数实例并行处理数据。是的,我事先知道生成的json的数量,我还创建了一个overview.json,其中包含诸如作业数之类的汇总信息——但请注意,这可能会很棘手,因为函数可能会失败,并且无法在BigQuery中创建表。作业持续时间是可变的。我也更喜欢第二种解决方案。我还考虑在BigQuery表中写入状态。您对此有何看法,尤其是与Firestore解决方案进行比较时?有什么优点/缺点吗?我想知道(比赛条件)的提示,谢谢!关于全局构建ID,在First Cloud函数中开发ID分配功能已经在路线图上了。Bigquery也是一个解决方案。一切都取决于你想做什么。是否要对每个零件的加工持续时间进行分析和统计?是的,BigQuery是分析、绘图和统计的正确场所。但是,如果你不需要,我强烈推荐Firestore:更快更便宜。对于竞赛条件,我更新我的答案