Skip to main content

在 Google Cloud 中运行 FireWorks 工作流程

项目描述

北欧化工

Google Cloud Platform 计算服务(GCP)上运行FireWorks 工作流程。

请参阅 repo Borealis和 PyPI 页面borealis-fireworks

它是什么?

FireWorks是一个开源的工作流管理系统,也就是说,它驱动相互依赖的计算任务。在众多可用的工作流系统中,FireWorks 非常简单、轻巧且适应性强。它经过了很好的测试和支持。它需要的唯一共享服务是 MongoDB 服务器(充当工作流“LaunchPad”)和文件存储。

Borealis可让您在Google Cloud Platform中启动任意数量的临时工作机器来运行您的工作流程。这意味着按使用付费并且工作流之间没有争用。

Borealis 如何支持 Google Cloud Platform 上的工作流程?

TL;DR:在需要时启动工作机器,将任务代码部署到 Docker 映像中的工作机器,并将数据存储在 Google Cloud Storage 而非 NFS 中。

Google Cloud Platform 上的 Borealis Fireworks 示意图

图 1. 蓝色六边形代表 Google Cloud Platform 服务。LaunchPad 显示为蓝色六边形,因为它是作为 MongoDB 服务器实现的,您可以在 Compute Engine 上运行。

Worker VM:作为云计算平台,Google Compute Engine (GCE) 拥有大量可用的机器。您可以启动大量 GCE“实例”(也称为虚拟机或 VM)来运行您的工作流程、更改您的代码、重新运行一些任务,然后让工作人员超时并关闭。Google 将根据使用情况向您收费,并且不会与您的队友发生资源争用。

Borealis 提供ComputeEngine类及其命令行包装器gce 来创建、调整和删除工作虚拟机组。

Borealis 提供fireworkerPython 脚本作为每个工人的顶级程序运行。它调用 FireWorks 的rlaunch功能。

只要这些 Fireworker 可以连接到您的 MongoDB 服务器并连接到其输入和输出文件的数据存储,您就可以在 GCE 上和关闭这些 Fireworker 运行它们。

Docker:您需要将有效负载任务代码部署到那些 GCE 虚拟机。它可能是 Python 源代码及其运行时环境,例如 Python 3.8、Python pip 包、Linux apt 包、编译的 Cython 代码、数据文件和环境变量设置。GCE 虚拟机从GCE 磁盘映像启动,该磁盘映像可能已经预装了所有内容(有或没有 Python 源代码),但很难保持最新状态,也很难跟踪如何重现它。

这就是 Docker 镜像的设计目的。您维护Dockerfile包含构建 Docker 镜像的指令,然后使用Google Cloud Build 服务构建镜像并将其存储在Google Container Registry中。

Borealis 提供DockerTaskFiretask 在 Docker 中运行任务。它拉取一个命名的 Docker 映像,启动一个 Docker 容器,在该容器中运行给定的 shell 命令,然后关闭该容器。在容器中运行还将任务的运行时环境和副作用与 Fireworker 和其他任务隔离开来。

Google Cloud Storage:虽然您可以为工作人员的文件设置 NFS 共享文件服务,但Google Cloud Storage (GCS) 是本机存储服务。GCS 的成本实际上是 NFS 服务的 1/10,并且可以更好地扩展。GCS 可让您将文件归档在成本较低的层中,以便不经常访问。几乎所有 Google 的云服务都围绕 GCS,例如,Pub/Sub 可以触发对特定上传到 GCS 的操作。

但云存储不是文件系统。它是一个具有轻量级协议的对象存储,用于获取/存储/列出整个文件,称为“blob”。它不支持同时写入者。相反,blob 的最后一个“存储”获胜。Blob 路径名可以包含/字符,但 GCS 没有实际的目录对象,因此无法自动重命名目录。

DockerTask通过从 GCS 获取任务的输入文件并将其输出文件存储到 GCS 来支持 Cloud Storage。

日志: DockerTask记录 Container 的标准输出和标准错误,并 fireworker设置 Python 日志以写入谷歌的 StackDriver云日志服务,这样您就可以实时观察您的工作人员的运行情况。

项目:使用 Google Cloud Platform,您可以设置一个项目供您的团队使用。所有服务、虚拟机、数据和访问控制都在项目范围内。

如何运行工作流

完成一次性设置后,运行工作流的步骤如下:

  1. 构建包含要在工作流中运行的有效负载任务的 Docker 容器映像。该gcloud builds submit命令将上传您的代码和一个 Dockerfile.,然后触发 Google Cloud Build 服务器服务器来构建 Docker Image 并将其存储在 Google Container Registry 中。

    请参阅构建您的 Docker 映像了解如何构建 Docker 映像,从编写Dockerfile.

  2. 构建您的工作流程并将其上传到 MongoDB。您可以通过编写.yaml文件并运行lpad 命令行工具上传文件来手动执行此操作,或者通过实现 调用 FireWorks API 来构建和上传对象的工作流构建器程序来自动执行此操作。Workflow

    工作流将运行DockerTaskFiretask 的实例。当然它也可以运行其他 Firetask;他们只是不会从DockerTask.

    如果您需要打开通往运行在 Google Compute Engine VM 中的 MongoDB 服务器的安全 ssh 隧道,请使用borealis/setup/example_mongo_ssh.sh shell 脚本。

  3. 启动一个或多个fireworker进程以运行工作流任务。

    有三种方法可以做到这一点:

    • 通过运行Python 脚本在本地运行fireworker进程(这对调试很方便) 。fireworker
    • 通过运行 Python 脚本在 Compute Engine 虚拟机上启动一组 Fireworker(这对于并行完成大量工作非常方便)gce
    • ComputeEngine通过在 Borealis类构建和上传工作流后调用工作流构建器代码,自动在 GCE 上启动一组消防员。
  4. 在它运行和之后,您可以:

    • 观看GCP 主仪表板

      提示:将 VM 负载图表添加到此页面。

    • 观看Compute Engine VM Instances 控制台以查看您的工作人员列表

    • 观看您正在运行的操作的Google Cloud Logs Explorer
      (设置一个日志查询resource.labels.instance_id:"fireworker" severity>=INFO,例如查看 Fireworkers 和 Firetasks 启动和停止的大图。:意思是“开始于”。
      扩展日志级别以severity>=DEBUG包括任务 stdout 和 stderr 行。
      如果同事也在运行工作流,您可以过滤只使用您自己的 Fireworkers 使用查询 resource.labels.instance_id:"fireworker-USER-",插入您的 $USER 名称。)

    • 打开 Fireworks Web GUI

      lpad webgui
      

      错误:如果lpad webgui命令打印错误
      TypeError: cannot pickle '_thread.lock' object
      ,这意味着您遇到了与 Python 3 上的 FireWorks 的兼容性问题。

      修复:升级到fireworks>=1.9.7.

      解决方法:如果您无法更新烟花,则运行

      lpad webgui -s
      

      它在没有 Web 浏览器的情况下启动 Web 服务器,并手动打开浏览器到它打印的 Web 服务器 URL,例如http://127.0.0.1:5000。(在 iTerm 中,只需 CMD 并单击 URL。)

    • 查询您的 Fireworks 任务和工作流

      lpad get_fws
      lpad get_wflows
      lpad report
      
    • 重新运行 Fireworks 任务或工作流

      lpad rerun_fws -i <FW_IDS>
      lpad rerun_fws -s FIZZLED
      
    • 暂停/重新启动 Fireworks 任务或工作流

      lpad pause_fws -i <FW_IDS>
      lpad resume_fws -i <FW_IDS>
      lpad defuse_fws -i <FW_IDS>
      lpad reignite_fws -i <FW_IDS>
      
      lpad pause_wflows -i <FW_IDS>
      lpad defuse_wflows -i <FW_IDS>
      lpad rerun_fws -i <FW_IDS>
      lpad reignite_wflows -i <FW_IDS>
      
    • 构建一个包含错误修复的新 Docker 映像,然后重新运行 Fireworks 任务。

      如果所有消防员都已退出,请运行gce命令以启动新的消防员。

    • 发射额外的消防员:

      gce --base <BASE> --count <COUNT> <NAME-PREFIX>
      

      设置 BASE number 参数或 NAME-PREFIX 参数,以便新的 VM 名称不会与您已经运行的 VM 冲突。

    • 存档或删除工作流 或重置整个 Launchpad 数据库:

      lpad archive_wflows -i <FW_IDS>
      
      lpad delete_wflows -i <FW_IDS>
      
      lpad reset
      
  5. 通过 gsutil命令行工具、 gcsfuse文件挂载工具和 Google Cloud Platform Web 控制台中 的存储浏览器访问 GCS 中的输出文件。

    提示:用于gsutil -m并行传输多个文件。(如果它打印,请按照 安装开发工具TypeError: cannot pickle...中的说明配置gcloud和使用 Python 3.7 。)gsutil

有关北欧化工组件的更多详细信息

Borealis 组件可以单独使用。它们共同支持在 Google Cloud 中运行 FireWorks 工作流程。

gce: 该类ComputeEngine及其命令行包装器gce 创建、调整和删除一组工作虚拟机。

生成工作流程后,调用 FireWorks LaunchPad.add_wf() (或运行 FireWorks 的lpad add命令行工具)将其上传到 LaunchPad。然后调用ComputeEngine.create()(或gce命令行)启动一组工作 VM 以运行该工作流并传入参数,例如 LaunchPad 数据库名称和用户名(通过 GCE 元数据字段)。

ComputeEngine并且gce还可以立即删除一组工作虚拟机或要求他们在 Firetask 之间彻底退出,尽管我们通常让 Fireworker 在空闲超时后自行关闭。

ComputeEngine并且gce还可以在一组工作人员上设置 GCE 元数据字段。这用于实现该--quit-soon功能。

安装borealis-fireworkspip 后:

$ gce -h
usage: gce [-h] [--delete | --set-metadata | --quit-soon] [-d] [-b BASE]
           [-c COUNT] [-f FAMILY] [-l LAUNCHPAD_FILENAME]
           [-m METADATA_KEY=VALUE]... [-o OPTION_KEY=VALUE]...
           NAME-PREFIX

Create, delete, or set metadata on a group of Google Compute Engine VMs, e.g.
workflow workers that start up from a disk image-family. (This code also has
an API for programs to call.)

...

或者在borealis-fireworks源代码存储库中运行它:

$ python -m borealis.gce -h

fireworker: Pythonfireworker脚本作为每个工作节点的顶级程序运行。 fireworker读取工作程序启动参数并调用 FireWorks 库以“快速发射”您的 FireWorks“火箭”。它还处理服务器关闭。

fireworker将 Python 日志记录连接到 Google Cloud 的 StackDriver 日志记录,以便您可以实时查看所有工作机器。

fireworker在 GCE VM 上运行,您需要创建一个 GCE 磁盘映像,其中包含 Python、borealis-fireworks pip 等。请参阅 how-to-install-gce-server.txt中的说明。

fireworker命令也可以在本地计算机上运行,​​以便于调试。为此,您需要安装borealis-fireworkspip 并设置您的计算机以访问正确的 Google Cloud 项目。

$ fireworker -h
usage: fireworker.py [-h] [-l LAUNCHPAD_FILENAME] [-s] [--development]

Run as a FireWorks worker node, launching rockets rapidfire. Gets configuration
settings from Google Compute Engine (GCE) metadata attributes when running on
GCE, else from the Launchpad file (see the `-l` option), with fallbacks. The
setup source files are "/Users/jerry/dev/borealis/borealis/setup/*"
...

DockerTask: FiretaskDockerTask拉取一个命名的 Docker 映像,启动一个 Docker 容器,在该容器中运行给定的 shell 命令,然后停止容器。

所需参数:

  • name记录任务
  • Dockerimage加载到容器中
  • command在容器中运行的shell
  • internal_prefix容器中的输入/输出基本路径名
  • storage_prefixGCS 中的输入/输出基本路径名

可选参数:

  • inputs输入文件和目录树
  • outputs输出文件和目录树
  • timeout用于停止 shell 命令,以秒为单位

Docker 总是在容器中运行一个 shell 命令。如果您想 Firetask在容器中运行 a,请包含一个小的 Python 脚本来弥补差距:将 Firetask 名称和 JSON 字典作为命令行参数,使用这些参数实例化 Firetask,然后调用 Firetask 的 run_task()方法。

DockerTask通过从 GCS 获取任务的输入文件、将它们映射到 Docker 容器、运行任务并将其输出文件存储到 GCS 来支持 Google Cloud Storage (GCS)。这意味着您需要将输入和输出路径指定为DockerTask参数。(您的工作流构建器代码可以使用此路径信息来计算 FireWorks 的任务到任务的相互依赖性。)

您在 DockerTask 中指定的每个路径都inputs表示outputs 一个文件目录树,如果它以/.

存储任务输出文件时,DockerTask创建名称以 结尾的条目 /作为目录占位符,加速面向树的遍历。这意味着您可以在 不使用标志的情况下 运行gcsfuse--implicit-dirs,从而使挂载的目录运行速度提高 10 倍。

DockerTask对在 Docker 容器中运行的任务施加给定的超时。

DockerTask将 Container 的 stdout 和 stderr 记录到文件和 Python 日志记录(fireworker连接到StackDriver)。

下一步是什么?

请参阅团队设置步骤和开发人员设置步骤。

请参阅构建您的 Docker 映像

请参阅更改日志(又名发行说明)

另请参阅方便的链接

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

Boralis-fireworks-0.11.0.tar.gz (251.4 kB 查看哈希)

已上传 source

内置分布

Boralis_fireworks-0.11.0-py2.py3-none-any.whl (41.2 kB 查看哈希

已上传 py2 py3