2016-12-13 9 views
0

Cloudflow PubSubのサブスクリプションから生まれた、Google Dataflowの無制限ストリーミングPCollectionでの作業。 BigTableにイベントを継続的に配信するために、これをFirehoseとして使用しています。配達のすべてがうまくいきます。Cloud Dataflow:ウォーターマークが進んだときの副作用

私たちの問題は、BigTableが配信されてから1日分のデータを読み込むことを期待する下流バッチジョブがあることです。ウォーターマークが日のしきい値を超えて進んだときに、マーカ行をbigtableに書き出す副作用を実装するために、ウィンドウ処理とトリガーを利用したいと思います。これは、データフローにイベントの大半が配信されたと信じる理由がある(完全性についての強い保証が必要であり、合理的な保証が必要)、下流の処理を開始することができます。

私たちが試みたのは、the timing information in the paneを使用してパイプラインに1つのシンクとして、次に別のシンクにウィンドウを書き出し、ウォーターマークが進んでいるかどうかを判断することでした。このアプローチの問題点は、未処理のイベント自体を再度操作することです。これは、イベント行の書き込みを繰り返すため望ましくありません。この書き込みを防ぐことができますが、パイプラインのパラレル・パスはウィンドウ・ストリームのイベントに対しても動作します。

透かしが進んだときに単一のアクションを実行できるように、コールバックの並べ替えを透かしに付加する効果的な方法はありますか?イベント時間にタイマーを設定し、コールバックを受信する

答えて

1

一般的な能力は間違いなく、活発に開発されてBEAM-27として提出された重要な機能要求、です。

実際には、FixedWindows.of(Duration.standardDays(1))にウィンドウを表示するアプローチは、Dataflow Java SDK 1.xの機能を使用して目的を達成するようです。あなたのパイプラインをフォークする代わりに、トリガーAfterPane.elementCountAtLeast(1)を追加することで、 "firehose"動作を維持することができます。それはGroupByKeyの費用がかかりますが、何も複製しません。

完全なパイプラインは次のようになります。私はあなたのユースケースのいくつかの詳細を逃した場合

pipeline 
    // Read your data from Cloud Pubsub and parse to MyValue 
    .apply(PubsubIO.Read.topic(...).withCoder(MyValueCoder.of()) 

    // You'll need some keys 
    .apply(WithKeys.<MyKey, MyValue>of(...)) 

    // Window into daily windows, but still output as fast as possible 
    .apply(Window.into(FixedWindows.of(Duration.standardDays(1))) 
       .triggering(AfterPane.elementCountAtLeast(1))) 

    // GroupByKey adds the necessary EARLY/ON_TIME/LATE labeling 
    .apply(GroupByKey.<MyKey, MyValue>create()) 

    // Convert KV<MyKey, Iterable<MyValue>> 
    // to KV<ByteString, Iterable<Mutation>> 
    // where the iterable of mutations has the "end of day" marker if 
    // it was ON_TIME 
    .apply(MapElements.via(new MessageToMutationWithEndOfWindow()) 

    // Write it! 
    .apply(BigTableIO.Write.to(...); 

私の答えにコメントをしてください。

関連する問題