web-dev-qa-db-ja.com

ウィンドウ時間に関係なく、Apache Flinkで2つのストリームを組み合わせる

組み合わせる2つのデータストリームがあります。問題は、1つのデータストリームの周波数が他のデータストリームよりもはるかに高く、1つのストリームがイベントをまったく受信しない場合があることです。 1つのストリームの最後のイベントを使用して、これから来るすべてのイベントで他のストリームと結合することはできますか?

私が見つけた唯一の解決策は結合関数を使用することですが、結合関数を適用できる共通のウィンドウを指定する必要があります。 1つのストリームがイベントを受信して​​いない場合、これはウィンドウに到達していません。

いずれかのストリームからのすべてのイベントに結合関数を適用して、最後に消費されたイベントの状態を維持し、このイベントを結合関数に使用する可能性はありますか?

役立つヒントをありがとうございます!

16
FLoppix

Flinkで2つのストリームを結合または結合するには、それぞれの特定のユースケースの要件に応じて、さまざまなアプローチがあります。これを「手動」で行う場合、FlinkのConnectedStreamsをRichCoFlatMapFunctionまたはCoProcessFunctionと組み合わせて使用​​する必要があります。これらのいずれかを使用すると、管理された状態(つまり、まれに更新されるストリームの最後の要素)を維持し、より高速なストリームと結合できます。 CoProcessFunctionは、タイマーを操作する機能を追加します。タイマーが期限切れのキーの状態をクリアするために使用する必要がある場合は、タイマーを使用する必要があります。

Flinkトレーニングサイトでは、このような結合を実装するためのさまざまなアプローチについての演習があります: Enrichment Joins 。より簡単な例については、 Expiring State に関する演習も参照してください。

Flinkの最近の各リリースには、追加の組み込み結合関数が含まれているため、現時点では、独自にロールする必要はあまりありません。詳細については、 DataStream APIとの結合テーブルAPIとの結合 、および SQLでの結合 のページを参照してください。

18
David Anderson