2017-09-02 4 views
7

私は結合したい2つのデータストリームを持っています。問題は、あるデータストリームが他のデータストリームよりもはるかに高い周波数を持ち、あるストリームがまったくイベントを受信しない時間があることです。 1つのストリームの最後のイベントを使用して、来るすべてのイベントで他のストリームに参加させることは可能ですか?ウィンドウの時間に関係なくApache Flinkで2つのストリームを結合する

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

1つのストリームまたは他のストリームから来て、最後に消費されたイベントの状態を維持するすべてのイベントに結合機能を適用し、このイベントを結合機能に使用できますか?

アドバイスをお寄せいただきありがとうございます!

答えて

5

FlinkのConnectedStreamRichCoFlatMapFunctionまたはCoProcessFunctionで使用したいと考えています。どちらの場合でも、管理状態(まれに更新されるストリームの最後の要素)を保持し、より高速なストリームに参加させることができます。 CoProcessFunctionはタイマーを処理する機能を追加します。期限切れのキーの状態をクリアするために使用する必要があります(該当する場合)。

このような参加を実装するためのFlinkトレーニングサイトの練習があります:Low-latency Event Time Join

更新:Flink 1.5(2018年2月現在リリースされていません)では、SQLライブラリhas an implementation of non-windowed stream joinsです。 MapState<Long, Record>を使用して、レコードをFlink状態で格納します。ここで、Longはタイムスタンプで、これらのマップを反復してタイムスタンプを比較して結合します。トレーニングの例(上記のリンクを参照)と比較すると、必要なときにレコードをデシリアライズするだけの利点があります。

+0

ありがとうございました!これはまさに私が探していたものです! – FLoppix

+0

@DavidAnderson反対に、2つの高速(頻繁な)ストリームを結合するときの例が異なるのでしょうか?あなたは何を変えますか? – Beckham

関連する問題