概要: 新しいI/Oコネクタの開発

組み込みI/Oコネクタでサポートされていないデータストアに接続する必要があるユーザー向けのガイド

Beamの既存のI/Oコネクタでサポートされていないデータストアに接続するには、カスタムI/Oコネクタを作成する必要があります。コネクタは通常、ソースとシンクで構成されます。すべてのBeamソースとシンクは複合変換ですが、カスタムI/Oの実装はユースケースによって異なります。開始するための推奨手順を以下に示します。

  1. この概要を読み、実装を選択してください。質問がある場合は、Beam開発メーリングリストにメールで問い合わせることができます。また、他の誰かが同じI/Oコネクタに取り組んでいないかを確認できます。

  2. I/OコネクタをBeamコミュニティに貢献する予定がある場合は、Apache Beam貢献ガイドを参照してください。

  3. 追加のスタイルガイドの推奨事項については、PTransformスタイルガイドを参照してください。

ソース

境界付き(バッチ)ソースの場合、現在、Beamソースを作成するための2つのオプションがあります。

  1. Splittable DoFnを使用します。

  2. ParDoGroupByKeyを使用します。

Splittable DoFnは、境界付きソースと境界なしソースの両方にとって最新のソースフレームワークであるため、推奨されるオプションです。これは、新しいシステムでSource API(BoundedSourceおよびUnboundedSource)を置き換えることを目的としています。Splittable DoFnの書き方については、分割可能なDoFnプログラミングガイドをお読みください。詳細については、マルチSDKコネクタの取り組みに関するロードマップを参照してください。

JavaおよびPythonの境界なし(ストリーミング)ソースの場合、チェックポイント、ウォーターマークの制御、バックログの追跡など、ストリーミングパイプラインに役立つ機能をサポートするSplittable DoFnを使用する必要があります。

分割可能なDoFnインターフェースを使用するタイミング

Splittable DoFnを使用するかどうか不明な場合は、お気軽にBeam開発メーリングリストにメールで問い合わせください。具体的なケースの長所と短所について話し合うことができます。

場合によっては、Splittable DoFnを実装することが必要になったり、パフォーマンスが向上したりする可能性があります。

たとえば、ファイルごとに多数のレコードを含む新しいファイル形式から読み取る場合や、ソートされたキー順での読み取り操作をサポートするキー値ストアから読み取る場合などです。

SDFを使用したI/Oの例

Javaの例

Pythonの例

ParDoとGroupByKeyの使用

データを並行して読み取ることができるデータストアまたはファイル形式の場合、プロセスをミニパイプラインとして考えることができます。これは多くの場合、次の2つのステップで構成されます。

  1. 並列で読み取るためにデータを分割する

  2. それらの各部分から読み取る

これらの各ステップはParDoになり、その間にGroupByKeyが挟まります。GroupByKeyは実装の詳細ですが、ほとんどのランナーでは、GroupByKeyを使用すると、状況によってはランナーが異なる数のワーカーを使用できるようになります。

さらに、GroupByKeyを使用すると、その機能をサポートするランナーで動的なワークリバランスも可能になります。

以下は、データを並列に読み取れる場合に、「ミニパイプラインとして読み取る」モデルを使用する読み取り変換の実装例です。

並列読み取りができないデータストアまたはファイルの場合、読み取りは単一のParDo+GroupByKeyで完了できる単純なタスクです。例えば

シンク

Beamシンクを作成するには、受信したレコードをデータストアに書き込むParDoを使用することをお勧めします。より複雑なシンク(たとえば、ランナーが再試行したときにデータの重複排除をサポートするなど)を開発するには、ParDoGroupByKey、およびその他の利用可能なBeam変換を使用します。多くのデータサービスは、要素のバッチを一度に書き込むように最適化されているため、書き込み前に要素をバッチにグループ化することが理にかなっている場合があります。永続的な接続は、すべての要素を受信するたびにではなく、DoFnのsetUpまたはstartBundleメソッドで初期化することもできます。大規模な分散システムでは、作業が失敗したり、再試行されたりする可能性があるため、外部とのやり取りは可能な限りべき等にすることが望ましいことにも注意する必要があります。

ファイルベースのシンクの場合、JavaおよびPython SDKの両方で提供されるFileBasedSink抽象化を使用できます。BeamのFileSystemsユーティリティクラスは、ファイルの読み書きにも役立ちます。詳細については、言語固有の実装ガイドを参照してください。