首页 > 解决方案 > 如何在 GCP 上使用 Apache Beam Dataflow 手动将可执行文件复制到工作人员

问题描述

Beam 和 GCP 有点新。遵循本文档并使用 Beam 'subprocess' 示例,我一直在研究一个运行 C 二进制文件的简单 Java 管道。使用 directRunner 时它运行良好,我现在正试图让它在云中运行。随着文件暂存在 gs 存储桶中,我收到错误消息:'无法运行程序“gs://mybucketname/tmp/grid_working_files/Echo”:错误 = 2,没有这样的文件或目录'这是有道理的,因为我猜你可以'不直接从云存储中执行?我现在卡住的地方是如何将可执行文件移动到工作人员。该文件指出:

当您使用原生 Apache Beam 语言(Java 或 Python)时,Beam SDK 会自动将所有必需的代码移至工作线程。但是,当您调用外部代码时,您需要手动移动代码。 要移动代码,请执行以下操作:

  1. 将编译后的外部代码连同版本信息一起存储在 Cloud Storage 中。
  2. 在@Setup 方法中,创建一个同步块来检查代码文件是否在本地资源上可用。您可以在第一个线程完成时使用静态变量确认可用性,而不是实施物理检查。
  3. 如果文件不可用,请使用 Cloud Storage 客户端库将文件从 Cloud Storage 存储分区拉取到本地工作器。推荐的方法是为此任务使用 Beam FileSystems 类。
  4. 移动文件后,确认在代码文件上设置了执行位。
  5. 在生产系统中,检查二进制文件的哈希以确保文件已正确复制。

我看过 FileSystems 类,我想我理解它,但我不知道我需要将文件复制到哪里。是否有工作人员使用的已知目录或文件路径?我正在使用数据流运行器。

标签: javagoogle-cloud-platformgoogle-cloud-dataflowdataflow

解决方案


您可以将文件复制到工作人员本地文件系统中的任何您想要的位置,例如,您可以使用该tempfile模块创建一个新的空临时目录,以便在运行之前复制您的可执行文件。

使用自定义容器也可能是一个很好的解决方案。


推荐阅读