web-dev-qa-db-ja.com

Apache Beamを使用したウィンドウ処理-ウィンドウが閉じていないように修正されましたか?

Apache Beamパイプラインで固定ウィンドウを使用しようとしています(DirectRunnerを使用)。フローは次のとおりです。

  1. Pub/subからデータをプルする
  2. JSONをJavaオブジェクトに逆シリアル化する
  3. 5秒の固定ウィンドウ付きウィンドウイベント
  4. カスタムCombineFnを使用して、Eventsの各ウィンドウを_List<Event>_に結合します
  5. テストのために、結果の_List<Event>_を出力するだけです。

パイプラインコード:

_    pipeline
                // Read from pubsub topic to create unbounded PCollection
                .apply(PubsubIO
                    .<String>read()
                    .topic(options.getTopic())
                    .withCoder(StringUtf8Coder.of())
                )

                // Deserialize JSON into Event object
                .apply("ParseEvent", ParDo
                    .of(new ParseEventFn())
                )

                // Window events with a fixed window size of 5 seconds
                .apply("Window", Window
                    .<Event>into(FixedWindows
                        .of(Duration.standardSeconds(5))
                    )
                )

                // Group events by window
                .apply("CombineEvents", Combine
                    .globally(new CombineEventsFn())
                    .withoutDefaults()
                )

                // Log grouped events
                .apply("LogEvent", ParDo
                    .of(new LogEventFn())
                );
_

私たちが見ている結果は、ロギングを取得しないため、最終ステップが実行されないことです。

また、カスタムCombineFnクラスの各メソッドにSystem.out.println("***")を追加して、これらがいつ実行されるかを追跡しましたが、どちらも実行されていないようです。

ここでウィンドウ設定が正しく設定されていませんか? https://beam.Apache.org/documentation/programming-guide/#windowing にある例に従いました。これはかなり簡単に思えますが、明らかに根本的な欠落があります。

どんな洞察も大歓迎です-事前に感謝します!

10
Chris Staikos

主な問題は確かにトリガーの欠落だったようです。ウィンドウが開いていて、いつ結果を出すかを指示するものが何もありませんでした。 (イベント時間ではなく)処理時間に基づいて単純にウィンドウ処理したかったので、次のようにしました。

.apply("Window", Window
    .<Event>into(new GlobalWindows())
    .triggering(Repeatedly
        .forever(AfterProcessingTime
            .pastFirstElementInPane()
            .plusDelayOf(Duration.standardSeconds(5))
        )
    )
    .withAllowedLateness(Duration.ZERO).discardingFiredPanes()
)

基本的に、これによりグローバルウィンドウが作成され、最初の要素が処理されてから5秒後にイベントを発行するようにトリガーされます。ウィンドウが閉じられるたびに、要素を受け取ると別のウィンドウが開かれます。 withAllowedLatenessのピースがない場合、Beamは文句を言いました。私が知る限り、これは最新のデータを無視するように指示しているだけです。

私の理解はここでは少し外れているかもしれませんが、上記のスニペットは私たちの問題を解決しました!

12
Chris Staikos