编排小型python任务(主要在BigQuery中执行SQL)的最佳实践

编排小型python任务(主要在BigQuery中执行SQL)的最佳实践,python,google-bigquery,google-cloud-functions,airflow,google-cloud-composer,Python,Google Bigquery,Google Cloud Functions,Airflow,Google Cloud Composer,我们正在GCP中使用pubsub和cloud功能来协调我们的数据工作流 我们的工作流程类似于: pubsub1和pubsub3可在不同时间触发(例如:凌晨1点和凌晨4点)。它们每天都从外部源(我们的ETL、Talend)触发 我们的云函数基本上在BigQuery中执行SQL 这工作正常,但我们必须手动创建一个编排数据库,以便在函数开始和结束时记录(以回答“函数X执行是否正常?”)的问题。编排逻辑与我们的业务逻辑紧密耦合,因为我们的云功能必须知道之前必须执行哪些功能,之后触发哪些pubsub 因

我们正在GCP中使用pubsub和cloud功能来协调我们的数据工作流

我们的工作流程类似于:

pubsub1和pubsub3可在不同时间触发(例如:凌晨1点和凌晨4点)。它们每天都从外部源(我们的ETL、Talend)触发

我们的云函数基本上在BigQuery中执行SQL

这工作正常,但我们必须手动创建一个编排数据库,以便在函数开始和结束时记录(以回答“函数X执行是否正常?”)的问题。编排逻辑与我们的业务逻辑紧密耦合,因为我们的云功能必须知道之前必须执行哪些功能,之后触发哪些pubsub

因此,我们正在寻找一种分离编排逻辑和业务逻辑的解决方案

我发现composer(气流)可能是一个解决方案,但是:

    >P>它本身不能运行云函数(而且API非常有限,每个项目调用16次,每秒100秒)

  • 我们可以将BigQuery与BigQuery操作符一起使用,但编排和业务逻辑将再次强耦合

那么,在我们的案例中,最好的做法是什么


感谢您的帮助

您可以使用Cloud Composer(气流)并重新利用大部分现有设置

首先,您可以保留所有现有的云功能,并使用(或其他您喜欢的)在气流中触发它们。您需要做的唯一更改是实现一个in-Airflow,从而触发您的云功能(从而确保您可以从流程的一端到另一端控制编排)

您的解决方案将是一个Airflow,它根据PubSub消息触发云功能,如果功能成功,则向Airflow报告,然后,如果两者都成功,则使用HTTP触发器或类似触发器触发第三个云功能,完全相同

最后一个注释,不是直观的。气流不是为了运行作业本身,而是为了协调和管理依赖关系。使用由气流触发的云功能并不是一种反模式,实际上是一种最佳实践


在您的情况下,您可以100%重写一些内容并使用BigQuery操作符,因为您不做任何处理,只触发查询/作业,但这一概念仍然是正确的,最佳做法是利用气流确保事情在需要的时间和顺序发生,而不是自行处理这些内容。(希望有意义)

您可以使用Cloud Composer(气流)并重新利用大部分现有设置

首先,您可以保留所有现有的云功能,并使用(或其他您喜欢的)在气流中触发它们。您需要做的唯一更改是实现一个in-Airflow,从而触发您的云功能(从而确保您可以从流程的一端到另一端控制编排)

您的解决方案将是一个Airflow,它根据PubSub消息触发云功能,如果功能成功,则向Airflow报告,然后,如果两者都成功,则使用HTTP触发器或类似触发器触发第三个云功能,完全相同

最后一个注释,不是直观的。气流不是为了运行作业本身,而是为了协调和管理依赖关系。使用由气流触发的云功能并不是一种反模式,实际上是一种最佳实践


在您的情况下,您可以100%重写一些内容并使用BigQuery操作符,因为您不做任何处理,只触发查询/作业,但这一概念仍然是正确的,最佳做法是利用气流确保事情在需要的时间和顺序发生,而不是自行处理这些内容。(希望有任何意义)

作为气流的替代方案,我会看看“argo工作流”->

它没有编写器那样的开销,特别是对于较小的工作负载

我会:

创建了一个从外部工具读取pubsub消息的部署,并将其部署到kubernetes

基于消息执行的工作流。工作流中的每个步骤都可以是一个云函数,打包在docker中

(我会用kubernetes作业取代云功能,然后由工作流触发。)

用docker打包一个云函数并在kuberentes中运行它是非常简单的


存在使用gsutil/bq/gcloud预构建的docker映像,因此您可以创建bash脚本,使用“bq”命令行在bigquery中执行内容。

作为气流的替代方案,我会查看“argo工作流”->

它没有编写器那样的开销,特别是对于较小的工作负载

我会:

创建了一个从外部工具读取pubsub消息的部署,并将其部署到kubernetes

基于消息执行的工作流。工作流中的每个步骤都可以是一个云函数,打包在docker中

(我会用kubernetes作业取代云功能,然后由工作流触发。)

用docker打包一个云函数并在kuberentes中运行它是非常简单的


存在使用gsutil/bq/gcloud预构建的docker映像,因此您可以创建bash脚本,使用“bq”命令行在bigquery中执行内容。

这似乎是一个涉及多个角度的相当大的问题。如果您能分享一些当前和预期变体的示例或冷运行,那就太好了。谢谢您的评论。你说的冷跑是什么意思?我分享了一张图片,这是我们想要实现的一个很好的例子。我知道这个问题可以通过很多方式解决,我只是想有一些想法,也许是那些成功实现了我们想要的气流的人的一些反馈。对不起,直译可能没有意义。