GCP 云上的长时间运行作业

Posted

技术标签:

【中文标题】GCP 云上的长时间运行作业【英文标题】:long-running job on GCP cloud run 【发布时间】:2020-04-26 00:50:41 【问题描述】:

我正在从 BigQuery 读取 1000 万条记录,并进行一些转换并创建 .csv 文件,这是我使用 Node.JS 上传到 SFTP 服务器的相同 .csv 流数据。

这项工作大约需要 5 到 6 小时才能在本地完成请求。

解决方案已在 GCP Cloud 运行中提出,但在 2 到 3 秒后,云运行正在关闭容器并出现 503 错误。

请在下面找到 GCP Cloud Run 的配置。

自动扩缩:最多 1 个容器实例 CPU分配:默认 分配的内存:2Gi 并发:10 请求超时:900 秒

GCP Cloud Run 是长时间运行后台进程的好选择吗?

【问题讨论】:

您使用了错误的工具。 Cloud Run 不适合这种情况。请改用 Cloud Dataflow。 是否可以在 Cloud Dataflow 步骤中上传文件? @格雷厄姆波利 先上传文件到云存储。 Cloud Dataflow 从 Cloud Storage 读取文件。 你想保留你的容器吗? @guillaumeblaquiere,是的,我想让容器长时间处于空闲状态,以便在后台处理请求。 【参考方案1】:

您可以使用部署了容器的 VM 实例并在其上执行您的工作。最后杀死或停止你的虚拟机。

但是,就我个人而言,我更喜欢无服务器解决方案和方法,例如 Cloud Run。然而,Cloud Run 上的 Long running 工作终有一天会到来!在此之前,您必须处理 60 分钟的限制或使用其他服务。

作为解决方法,我建议您使用 Cloud Build。是的,用于在其中运行任何容器的 Cloud Build。我wrote an article on this。我在 Cloud Build 上运行了一个 Terraform 容器,但实际上,您可以运行任何容器。

正确设置timeout,注意default service account and assigned role,以及Cloud Run 上尚不可用的东西,选择the number of CPUs (1, 8 or 32) for the processing 并加快您的进程。

想要奖金?你有120 minutes free per day and per billing account(小心,不是每个项目!

【讨论】:

谢谢您的建议。我会试试 Cloud Build 什么问题?你不想创建一个 cron 作业?或者你需要一个? Cloud Run 将限制提高到 60 分钟:cloud.google.com/run/docs/configuring/request-timeout @AaronN.Brock,产品发展迅速!!我在答案中更新了这部分!【参考方案2】:

您可以尝试使用通过 Cloud Dataflow 部署的 Apache Beam pipeline。使用 Python,您可以通过以下步骤执行任务:

第 1 阶段。从 BigQuery 表中读取数据。

beam.io.Read(beam.io.BigQuerySource(query=your_query,use_standard_sql=True))

第 2 阶段。将第 1 阶段的结果上传到 GCS 存储桶上的 CSV 文件中。

beam.io.WriteToText(file_path_prefix="", \
                    file_name_suffix='.csv', \
                    header='list of csv file headers')

第 3 阶段。调用 ParDo 函数,然后将在第 2 阶段创建的 CSV 文件上传到 SFTP 服务器。你可以参考this链接。

【讨论】:

【参考方案3】:

GCP Cloud Run 是长时间运行后台进程的好选择吗?

这不是一个好的选择,因为您的容器是通过传入的 HTTP 请求“复活”的,并且一旦容器响应(例如发回某些内容),Google 就会假定请求的处理已完成并切断 CPU。

这可以解释这一点:

解决方案已在 GCP Cloud 运行中提出,但在 2 到 3 秒后,云运行正在关闭容器并出现 503 错误。

【讨论】:

@mayurnimavat Cloud Run for Anthos 没有这个与 CPU 相关的生命周期限制。但它的成本更高,因为您的容器在集群上运行,而集群又在 GKE 上运行。【参考方案4】:

您可以考虑采用无服务器、事件驱动的方法:

配置谷歌存储触发云功能运行改造 将 BigQuery 提取/导出到 CF 触发器 - 这是获取 BigQuery 数据的最快方法

有时以这种方式导出的数据可能太大,由于最大执行时间(目前为 9 分钟)或内存限制 2GB 等限制,不适合以这种形式进行云函数处理, 在这种情况下,您可以将原始数据文件拆分为更小的部分和/或使用storage mirror 推送到 Pub/Sub

也就是说,我们已经使用 CF 处理了十亿条记录,从构建布隆过滤器到发布数据到 aerospike 只需几分钟。

【讨论】:

【参考方案5】:

更新:2021 年 10 月

Cloudrun 支持后台活动。

Configure CPU to be always-allocated if you use background activities
Background activity is anything that happens after your HTTP response has been delivered. To determine whether there is background activity in your service that is not readily apparent, check your logs for anything that is logged after the entry for the HTTP request.

Configure CPU to be always-allocated
If you want to support background activities in your Cloud Run service, set your Cloud Run service CPU to be always allocated so you can run background activities outside of requests and still have CPU access.


【讨论】:

【参考方案6】:

我将尝试使用 Dataflow 从 Big Query 创建 .csv 文件并将该文件上传到 GCS。

【讨论】:

以上是关于GCP 云上的长时间运行作业的主要内容,如果未能解决你的问题,请参考以下文章

如何停止长时间运行的 BigQuery 作业?

在 Rails 中运行大量长时间运行的后台作业

EMR Hadoop 长时间运行的作业被杀死

长时间运行的作业不应阻止合并 MR

在aws中预定长时间运行的c#作业

如何防止 Elastic Beanstalk 上长时间运行的作业在不阻止缩减的情况下终止?