2017-02-13 4 views
0

複数の入力ストリームを処理するDataflowジョブを実行しています。それらの中にはトラフィックが多いものもあれば、メッセージを受け取ったものはほとんどありません。すべてのストリームに、すべての要素に関連する情報を含む「共有」ストリームに参加しています。これは、パイプラインの単純化した例です。Dataflowパイプラインは、GroupByを実行する前にすべてのストリームから要素を待ちます。

Pipeline Example

私は両方ストリームが一部のトラフィックが含まれてまでジョブは、任意の出力を生成しないことに気づきました。

たとえば、は一定期間メッセージを生成しませんが、Stream 1はトラフィックの流れが安定しているとします。この時点では、ジョブのDAGは、GroupByKeyのステップで累積されている要素を表示しますが、それを超えて何も伝搬されません。また、グラフの左側の入力要素を表示するFlatten PCollectionのステップが表示されますが、右側のグラフは表示されません。これは、高い仕事量のトラフィックを扱うときに、Stream 2がメッセージを受け取るのにかかる時間だけ出力を遅らせるため、同じ仕事でトラフィック量の少ないストリームを処理するときに問題を引き起こします。

私は、観察が正しいかどうかわかりませんが、Flatten/GroupByKeyが一般的にどのように機能しているか尋ねたかったのですが、もしそうならば、私たちが見ている問題を避けることができます。パイプライン。

(例ジョブID:2017-02-10_06_48_01-14191266875301315728)

+0

この手順ではどのような種類のウィンドウとトリガーを使用していますか?ストリームの要素がなくても動作するように、ウィンドウ/トリガーを設定できるはずです。 – Pablo

+0

@Pablo 'FixedWindows'と' Sessions'は、デフォルトのトリガーと、30分分のギャップ時間を持っています。 私が知っている限り、処理時間や要素数を早めに追加したトリガを追加することはできますが、セッションの一部が不完全であることを意味するので避けたいと思います(30分間の非アクティブペインが放火されたときに通過しなかった可能性があります)。 – livathinos

答えて

1

group-by-keyの文書で説明したように、デフォルトの動作では、到着したために、ウィンドウ内のすべてのデータを待つことである - これは正確さを保証する必要がありますダウンストリームの結果が表示されます。

何をしようとしているかに応じて、triggersを使用して集計を先に出力することができます。

ファストストリームの処理には、スローストリームをside-inputとして使用することもできます。

まだ詰まっている場合は、より詳細な回答が目標に依存するため、ストリームの内容と使用方法をより詳細に記述することができれば助かります。

+0

ストリームのいずれかが要素を生成しない場合、 'GroupByKey'は、' Session'を閉じる必要があることをストリームの少なくとも1つの要素が知るまで待機しますか?正確な使用例は、ユーザーセッションを実装しようとしているところです。ここで、過度のメッセージタイプ(クリック、ページビューなど)全体でユーザーの活動を追跡しています。一部のセッションにはすべてのストリームの要素が含まれている場合があります(ユーザーが何かをクリックしてページを表示した場合など)。 – livathinos

+0

ジョブは現在〜20種類のストリームを消費していますが、それらのサブセットは「遅い」、または要素をまったく伝播しない資格があります。サイド入力の使用は、配信に失敗したり遅いストリームのいずれかになる可能性があるため、今後の進め方とは異なる可能性があります。 誤った設定の場合について考えています。何らかの理由で、サブスクリプションの1つでは設定エラーやそれ以上メッセージが伝播されずにメッセージを配信できないとします。これは、パイプラインがセッションウィンドウを無期限に保持することを意味しますか? – livathinos

+0

実際の動作は、アップストリームソースがウォーターマークを追跡する方法によって異なります。例えば、データが到着しない場合、PubSubソースは透かしが現在の時間に進むことを可能にする。しかし、CoGroupByKeyステップは、すべてのアップストリームソースのウォーターマークが固定ウィンドウの終わりを過ぎて進んでしまうまで待つ必要があります。 –

関連する問題