java - 如何在 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 会自动将所有必需的代码移至工作线程。但是,当您调用外部代码时,您需要手动移动代码。 要移动代码,请执行以下操作:
- 将编译后的外部代码连同版本信息一起存储在 Cloud Storage 中。
- 在@Setup 方法中,创建一个同步块来检查代码文件是否在本地资源上可用。您可以在第一个线程完成时使用静态变量确认可用性,而不是实施物理检查。
- 如果文件不可用,请使用 Cloud Storage 客户端库将文件从 Cloud Storage 存储分区拉取到本地工作器。推荐的方法是为此任务使用 Beam FileSystems 类。
- 移动文件后,确认在代码文件上设置了执行位。
- 在生产系统中,检查二进制文件的哈希以确保文件已正确复制。
我看过 FileSystems 类,我想我理解它,但我不知道我需要将文件复制到哪里。是否有工作人员使用的已知目录或文件路径?我正在使用数据流运行器。
解决方案
您可以将文件复制到工作人员本地文件系统中的任何您想要的位置,例如,您可以使用该tempfile
模块创建一个新的空临时目录,以便在运行之前复制您的可执行文件。
使用自定义容器也可能是一个很好的解决方案。
推荐阅读
- geolocation - 提取推文的地理位置
- python - 模块“tensorflow._api.v2.train”没有属性“write_graph”
- c++ - 调用 Lua 函数时的 LuaBind c++ 错误处理程序
- linux-kernel - 没有初始化函数时会加载Kernel模块吗?
- angular - 将字符串数组传递给 ngx-datatable 时出错
- python-3.x - 使用python创建的AzureFunction,HTTP请求长度限制为100MB
- r - 在ggplot2中向上舍入Y轴
- kubernetes - 在 kubernetes 配置文件中添加环境变量
- javascript - MediaRecorder 只记录一帧
- javascript - D3 事件侦听器返回 MouseEvent 而不是基准