概要

このページには、linuxオペレーティングシステムまたはamd64アーキテクチャを使用していないマシンでGo SDKパイプラインを開始するユーザー向けの技術的な詳細が含まれています。

Goは静的にコンパイルされる言語です。Goバイナリをマシンで実行するには、対応するオペレーティングシステムとプロセッサアーキテクチャ用にコンパイルする必要があります。これは、Go SDKパイプラインがワーカーでどのように実行されるかに影響します。

開発:go runの使用

リモートランナーに対して開発中のパイプラインを開始する場合は、開発環境からgo runを使用できます。Go SDKはパイプラインをlinux-amd64用にクロスコンパイルし、それをパイプラインのワーカーバイナリとして使用します。

あるいは、一部のローカルランナーはループバック実行をサポートしています。フラグ--environment_type=LOOPBACKを設定すると、ランナーがローカルバイナリに接続してワーカーとして機能するようになります。これにより、コンテナ内のログ出力が隠されるのを回避することで、開発とデバッグが簡素化されます。

本番環境:ワーカーバイナリのオーバーライド

Go SDKパイプラインバイナリには、目的のワーカーバイナリへのパスを設定するための--worker_binaryフラグがあります。このセクションでは、このフラグを使用して堅牢なGoパイプラインを使用する方法について説明します。

本番環境では、コンパイル済みアーティファクトのみにアクセスできることが一般的です。Go SDKパイプラインの場合、起動プラットフォーム用とワーカープラットフォーム用の2つが必要になる場合があります。

特定のプラットフォームでGoプログラムを実行するには、そのプログラムをそのプラットフォームのオペレーティングシステムとアーキテクチャをターゲットにしてビルドする必要があります。Goコンパイラは、ビルドの$GOOS$GOARCH環境変数を設定することで、ターゲットアーキテクチャにクロスコンパイルできます。

たとえば、M1 Macbookからパイプラインを起動しているが、amd64プロセッサで実行されている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固有のコンテナをリリースしています。これらのコンテナは、SDKに適したワーカーバイナリを適切にプロビジョニングして初期化します。

現在、Go SDKワーカーコンテナはlinux-amd64プラットフォームのみに構築されています。ARM64コンテナのサポートの現在の状態については、Issue 20807を参照してください。

Goは静的にコンパイルされるため、コンテナの特定のGoバージョンに対するランタイム依存関係はありません。ただし、バイナリのビルド方法によっては、バイナリのコンパイルに使用されたGoリリースがワーカーで実行されるリリースになります。最高の性能を得るには、最新のGoリリースにアップデートしてください。

CG0_ENABLED=0とglibc

Beam 2.48.0以降、デフォルトのクロスコンパイルは、ブートコンテナとglibcのバージョンの問題を軽減するためにCGO_ENABLED=0に設定されます。パイプラインの実行にCGOが必要な場合は、上記のワーカーバイナリのオーバーライドに関するセクションで、独自のビルド済みバイナリを使用する方法の詳細を確認してください。

Beamは、ベースとして最小限のdebianコンテナを使用します。バイナリに特定の実行要件がある場合は、カスタムコンテナをリリースされたコンテナから派生させて、それらを満たすことができます。カスタムコンテナを使用して、glibcの不一致を解決したり、実行時に追加のバイナリが必要になるのを回避したりします。