Apache Beam 2.33.0でGo SDKの実験段階が終了

Apache Beamの最新リリースであるバージョン2.33.0は、長らく実験段階にあったGo SDKの最初の正式リリースです。Goプログラミング言語で構築されたGo SDKは、JavaとPythonのSDKに加え、Beamプログラミングモデルの3つ目の実装となります。

新しいGo SDKの使用

Go SDKの新しいユーザーは、メインのbeamパッケージをインポートすることで、Goプログラムで使用を開始できます。

import "github.com/apache/beam/sdks/v2/go/pkg/beam"

次回のgo mod tidyの実行により、モジュールの最新の安定版が取得されます。あるいは、go get github.com/apache/beam/sdks/v2/go/pkg/beamを実行すると、モジュールがローカルのモジュールキャッシュにすぐにダウンロードされ、go.modファイルに追加されます。

実験的なGo SDKの既存ユーザーは、SDKの最新バージョンを使用するために、新しいv2インポートパスに更新する必要があります。これは、インポートパスにv2を追加し、github.com/apache/beam/sdks/go/…をgithub.com/apache/beam/sdks/v2/go/…に変更し、go mod tidyを実行することで行うことができます。

SDKの使用に関する詳細なドキュメントは、BeamプログラミングガイドおよびパッケージGo Docでご覧いただけます。

機能サポート

執筆時点では、Go SDKは現在「Batteries Not Included」です。つまり、サポートされているI/Oと変換にギャップやエッジケースが存在します。とはいえ、SDKのコアは、カスタムユーザーの使用のためにBeamモデルの多くの機能を有効にし、以下の機能をサポートしています。

  • PTransform
    • Impulse
    • Create
    • ユーザーDoFnを使用したParDo
      • 反復可能なサイド入力
      • 複数の出力エミッタ
      • キーと値のペアの送受信
      • SplittableDoFns
    • GroupByKeyとCoGroupByKey
    • ユーザーCombineFnsを使用したCombineとCombinePerKey
    • Flatten
    • Partition
    • 複合変換
    • クロス言語変換
  • イベント時間ウィンドウイング
    • グローバル、インターバル、スライディング、セッションウィンドウ
    • GroupByKeysまたはCombinesを使用したウィンドウ化されたPCollectionの集計
  • コーダー
    • プリミティブなGo型(整数、文字列、[]bytesなど)
    • Go構造体型(構造体、スライス、マップフィールドを含む)のBeamスキーマ
    • カスタムコーダーの登録
  • メトリクス
    • PCollectionメトリクス(要素数、サイズ推定)
    • カスタムユーザーメトリクス
    • ジョブ後のユーザーメトリクスのクエリ(2.34.0で提供予定)
    • DoFnプロファイリングメトリクス(2.35.0で提供予定)
  • 組み込み変換
    • 合計、カウント、最小値、最大値、トップ、フィルタ
    • スケーラブルなTextIO読み取り

今後の機能ロードマップと既知の問題については、以下で説明します。特に、Beamのクロス言語機能を通じて、より豊富なI/Oコネクタをサポートする予定です。

リリース

このリリースにより、Go SDKは依存関係管理にGo Modulesを使用するようになりました。これにより、ユーザー、SDK開発者、テストインフラストラクチャのすべてが同じバージョンの依存関係に依存できるようになり、ビルドの再現性が向上します。これにより、Go SDKリリース候補の検証が容易になります。

バージョン付きのSDKワーカーコンテナが構築され、公開されました。SDKは一致するタグ付きバージョンを使用します。カスタムコンテナを使用する場合を除き、ユーザーのジョブでは使用するコンテナを指定する必要がなくなりました。

互換性

Go SDKは、Goの互換性の概念に大きく従います。すべてのSDKを同じリリースサイクルで連携させるために、いくつかの譲歩が行われています。

言語互換性

SDKは、最低限Goプログラミング言語バージョン1.16でテストされ、利用可能な言語機能と標準ライブラリパッケージをそれに応じて使用します。幅広い互換性を維持するために、Go SDKはGoの最新のメジャーバージョンを必要としません。言語の2番目に新しいサポートされているリリースに従うことを期待しており、Go 1.18がリリースされた場合、SDKでGoジェネリクスの実験を開始するために例外が発生する可能性があります。言語の最小バージョンが変更された場合は、リリースノートで明示されます。

パッケージ互換性

主要なユーザーパッケージは、コア機能に関して後方互換性のない方法で変更されるのを避けます。これは、Goのimport compatibility ruleの概念と一致しています。

古いパッケージと新しいパッケージが同じインポートパスを持っている場合、新しいパッケージは古いパッケージと後方互換性がある必要があります。

このポリシーの例外は、新しい、実験的な、または開発中の機能に関するものであり、変更される可能性があります。そのような機能には、実験的な状態を示すドキュメントコメントがあります。大きな変更はリリースノートで言及されます。たとえば、トリガーを使用したbeam.WindowIntoは現在実験段階であり、今後のリリースでAPIが変更される可能性があります。

主要なユーザーパッケージには以下が含まれます。

  • メインのbeamパッケージgithub.com/apache/beam/sdks/v2/go/pkg/beam
  • .../transforms.../io.../runners.../testingの下位パッケージ。

一般的に、主要なユーザーパッケージ以外のモジュールのパッケージは、フレームワークの使用のためのものであり、変更される可能性があります。

既知の問題

バッテリーは含まれていません。

  • 現在のネイティブ変換はテスト不足です。
  • I/Oはスケールするように記述されていない可能性があります。
  • Go Direct Runnerは不完全であり、ポータブルではありません。PythonポータブルランナーまたはFlinkの使用をお勧めします。
    • サイド入力ウィンドウイングをサポートしていません。BEAM-13075
    • データをシリアル化しないため、コーダーの問題を検出する可能性が低くなります。BEAM-6372
    • 他の一般的な改善を使用し、ポータブルにすることができます。BEAM-11076
  • 現在のトリガーAPIは反復中であり、変更される可能性があります。BEAM-3304
    • 2.33.0と2.34.0の間でAPIが破壊的変更になる可能性があり、再び変更される可能性があります。
  • Google Cloud DataflowなどのサービスでのSDKのサポートは、サービス所有者の裁量によって異なります。
  • 何か必要ですか?

2.34.0で修正済み

  • top.SmallestPerKeyが壊れていました。BEAM-12946
  • beam.TryCrossLanguage APIがTryではないバージョンと一致しませんでした。BEAM-9918
    • beam.TryCrossLanguageを呼び出していた場合、これは破壊的変更です。

2.35.0で修正済み

  • グローバルウィンドウを使用していないサイド入力は一致しません(正確性のバグ)BEAM-11087
    • 2.35.0までは、グローバルウィンドウを使用していないサイド入力を使用しないことをお勧めします。
  • サイド入力を使用するDoFnは、バンドル全体でメモリを蓄積し、メモリ不足の問題を引き起こします。BEAM-13130

ロードマップ

SDKロードマップが更新されました。継続的な焦点は、ストリーミングに焦点を当てた機能を強化し、既存のコネクタを改善し、コネクタの実装を容易にすることです。

近い将来、これはサイド入力の改善、およびJavaからのクロス言語変換のラッパーの提供と使いやすさの向上という形で実現します。

結論

SDKが役に立つことを願っています。まだ初期段階です。Go SDKで何かを作成した場合は、共有することを検討してください。そして、貢献は常に歓迎されています。