概述
本页包含有关在未使用 linux
操作系统或 amd64
架构的机器上启动 Go SDK 管道的用户的技术细节。
Go 是一种静态编译语言。要在机器上执行 Go 二进制文件,必须针对匹配的操作系统和处理器架构对其进行编译。这会影响 Go SDK 管道在 工作器 上的执行方式。
开发:使用 go run
当您针对远程运行器启动开发中的管道时,您可以使用开发环境中的 go run
。Go SDK 将为 linux-amd64
交叉编译您的管道,并将其用作管道的 worker 二进制文件。
或者,一些本地运行器支持回环执行。设置标志 --environment_type=LOOPBACK
会导致运行器连接回本地二进制文件以充当 worker。这可以通过避免在容器中隐藏日志输出,从而简化开发和调试。
生产:覆盖 worker 二进制文件
Go SDK 管道二进制文件有一个 --worker_binary
标志,用于设置所需 worker 二进制文件的路径。本节将教您如何使用此标志来构建健壮的 Go 管道。
在生产环境中,通常只能访问已编译的工件。对于 Go SDK 管道,您可能需要两个:一个用于启动平台,另一个用于 worker 平台。
为了在特定平台上运行 Go 程序,该程序必须针对该平台的操作系统和架构进行构建。Go 编译器能够通过为构建设置 $GOOS
和 $GOARCH
环境变量 来交叉编译到目标架构。
例如,您可能正在从 M1 Macbook 上启动管道,但在使用具有 amd64 处理器的 linux VM 的 Flink 集群上运行作业。在这种情况下,您需要分别为启动编译 darwin-arm64
和为 linux-amd64
编译管道二进制文件。
# Build binary for the launching platform.
# This uses the defaults for your machine, so no new environment variables are needed.
$ go build path/to/my/pipeline -o output/launcher
# Build binary for the worker platform, linux-amd64
$ GOOS=linux GOARCH=amd64 go build path/to/my/pipeline -o output/worker
使用 --worker_binary
标志设置为所需的二进制文件来执行管道。
# Launch the pipeline specifying the worker binary.
$ ./output/launcher --worker_binary=output/worker --runner=flink --endpoint=... <...other flags...>
SDK 容器
Apache Beam 发布了 特定于 SDK 的容器供运行器使用,以启动 worker。这些容器会根据需要为 SDK 配置和初始化 worker 二进制文件。
目前,Go SDK worker 容器仅针对 linux-amd64
平台构建。有关 ARM64 容器支持的当前状态,请参阅 问题 20807。
由于 Go 是静态编译的,因此容器没有对特定 Go 版本的运行时依赖关系。但是,根据您的二进制文件的构建方式,用于编译二进制文件的 Go 版本将是您的 worker 执行的版本。务必更新到最新的 Go 版本 以获得最佳性能。
CG0_ENABLED=0 和 glibc
从 Beam 2.48.0 开始,默认交叉编译将 CGO_ENABLED=0 设置为减少引导容器和 glibc 版本之间的冲突。如果您的管道需要 CGO 才能运行,请参阅上面的覆盖 worker 二进制文件以获取有关使用您自己的构建的二进制文件的更多信息。
Beam 使用最小的 debian 容器作为基础。如果您的二进制文件具有特定的执行要求,则可以从发布的容器中派生 自定义容器 以满足这些要求。使用自定义容器来解决 glibc 不匹配问题或要求在执行时提供其他二进制文件。