【问题标题】:How to run a Python script every day in GCP?如何在 GCP 中每天运行 Python 脚本?
【发布时间】:2021-06-13 03:14:46
【问题描述】:

我有一个简单的脚本,它从 API 检索数据并将其加载到 BigQuery。我在使用 Cloud Functions 并且运行流畅,但是有时间达到了 9 分钟的运行时间限制。

在 GCP 中执行此操作的最佳方法是什么,并占用脚本所需的时间?我正在考虑创建另一个云函数,它每天启动一个可抢占的 VM,VM 执行脚本并最终自行关闭。为了保持低价,VM 总是在数据加载结束时关闭。它将在第二天的选定时间开始。

我不知道从哪里开始,但我想知道这是否是最好的方法。

【问题讨论】:

  • 为什么不使用 cron 作业?
  • 使用 Cloud Scheduler 的 GCP cron 作业?我今天已经用它来激活云功能了。我会用它来启动创建、执行和关闭 VM 的功能吗?我是这么想的,我只是不确定这是否真的是理想的。谢谢!
  • 您也可以考虑使用Google compute engine VM。 IIRC 你可以从 GCP 免费获得一个 f1-micro 实例。如果您的脚本对内存有很高的要求,您可能需要更大的实例。
  • 我将使用 Compute Engine 上的虚拟机。谢谢!我会寻找一种方法来创建它,运行 Python 脚本并每天将其关闭。
  • 脚本运行多长时间?它如何使用内存?它使用多CPU吗?它需要永久性磁盘吗?

标签: python google-cloud-platform google-cloud-functions google-compute-engine


【解决方案1】:

云功能并不适合运行时间可能超过 10 分钟的批处理作业。我建议您使用 Compute Engine 虚拟机运行您的工作,并结合使用云功能/云调度程序来调度它。

这是一个粗略的大纲:

  1. 设置容器化的 Compute Engine 虚拟机。
  2. 创建一个 Cloud 函数以在 pub-sub 触发器上启动 VM。
import googleapiclient.discovery

def start_job(event, context):
    """Triggered from a message on a Cloud Pub/Sub topic.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    compute = googleapiclient.discovery.build('compute', 'v1')
    compute.instances().insert(
        project='project_id',
        zone='us-east1-b',
        body=vm_config).execute()
  1. 创建一个 Cloud Scheduler 以根据您的计划触发 pub-sub。

这可以让您避免永远在线的虚拟机的成本。有关更多详细信息,请参阅此blog post

【讨论】:

  • 完美!谢谢! :)
【解决方案2】:

这行得通吗?

import schedule
import time

def run_daily():
    do something
    do something else        


schedule.every().day.at("08:20:30").do(run_daily) # HH MM SS

while True:
    schedule.run_pending()
    time.sleep(1)

【讨论】:

  • 谢谢!起初我想在加载数据后关闭虚拟机(对不起,我只是在帖子中包含了这个信息,它丢失了)。也就是说,VM 将仅在必要的时间(或预定的时间)内处于活动状态。但是如果我没有找到一个简单的解决方案,我会按照你演示的方式去做! :)
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2023-03-16
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多