ブログ
2020/12/14
Apache Beam の分割可能な DoFn が利用可能に
Splittable DoFn (SDF) が、バージョン 2.25.0 以降の Beam Python、Java、Go SDK で利用可能になったことをお知らせいたします。
2017 年に、Splittable DoFn のブログ記事 で、Splittable DoFn API を新しい推奨の I/O コネクタ構築方法として構築することが提案されました。Splittable DoFn は DoFn
を一般化したものであり、DoFn
の構文、柔軟性、モジュール性、コーディングの容易さを維持しながら、Source
のコア機能を提供します。したがって、よりシンプルで再利用可能なコードで複雑な I/O コネクタを開発することがはるかに容易になります。
SDF には、既存の UnboundedSource
および BoundedSource
に比べて 3 つの利点があります。
- SDF は、非制限の場合と制限付きの場合の両方を処理するための統一された API セットを提供します。
- SDF を使用すると、ソース記述子から動的に読み取ることができます。
- KafkaIO を例にとると、
UnboundedSource
/BoundedSource
API 内では、パイプラインの構築時に読み取るトピックとパーティションを指定する必要があります。UnboundedSource
/BoundedSource
が実行時にトピックとパーティションを入力として受け入れる方法はありません。しかし、それは SDF に組み込まれています。
- KafkaIO を例にとると、
- SDF は、分割機能を備えたパイプライン上の任意のノードとして自由に使用できます。
UnboundedSource
/BoundedSource
は、分割戦略からパフォーマンス上の利点を得るためには、パイプラインのルートノードである必要があり、多くの実世界での使用が制限されます。これは SDF ではもはや制限ではありません。
SDF は、前述のすべての改善により、使用できる状態になったため、新しい I/O コネクタを構築するための推奨される方法です。プログラミングガイドに従って、独自の Splittable DoFn の構築を試してみてください。Beam SDK には、一般的なタイプの RestrictionTracker
や WatermarkEstimator
など、さまざまな共通のユーティリティクラスが用意されており、簡単にオンボーディングできます。既存の I/O コネクタについては、UnboundedSource
および BoundedSource
の実装を Splittable DoFn にラップしましたが、開発者は UnboundedSource
/BoundedSource
を実際の Splittable DoFn 実装に変換して、より多くのパフォーマンス上の利点を得ることを推奨します。
この待望のデザインをデータ処理の世界にもたらしたすべての貢献者に感謝します。ユーザーが SDF の恩恵を受けることを非常に楽しみにしています。
以下に、探索するためのいくつかの実世界の SDF の例を示します。
実世界の Splittable DoFn の例
Java の例
- Kafka: Apache Kafka (オープンソースの分散イベントストリーミングプラットフォーム) の I/O コネクタ。
- Watch: 入力ごとに、入力ごとの終了条件が満たされるまで、出力の成長するセットを生成するポーリング関数を使用します。
- Parquet: Apache Parquet (オープンソースの列指向ストレージ形式) の I/O コネクタ。
- HL7v2: Google の Cloud Healthcare API の一部である、HL7v2 メッセージ (組織内で発生するイベントに関するデータを提供する臨床メッセージ形式) の I/O コネクタ。
- BoundedSource ラッパー: 既存の BoundedSource 実装を分割可能な DoFn に変換するラッパー。
- UnboundedSource ラッパー: 既存の UnboundedSource 実装を分割可能な DoFn に変換するラッパー。
Python の例
- BoundedSourceWrapper: 既存の BoundedSource 実装を分割可能な DoFn に変換するラッパー。
Go の例
- textio.ReadSdf は、分割可能な DoFn を使用してテキストファイルからの読み取りを実装します。