Apache Beamパイプラインで固定ウィンドウを使用しようとしています(DirectRunner
を使用)。フローは次のとおりです。
CombineFn
を使用して、Event
sの各ウィンドウを_List<Event>
_に結合します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 にある例に従いました。これはかなり簡単に思えますが、明らかに根本的な欠落があります。
どんな洞察も大歓迎です-事前に感謝します!
主な問題は確かにトリガーの欠落だったようです。ウィンドウが開いていて、いつ結果を出すかを指示するものが何もありませんでした。 (イベント時間ではなく)処理時間に基づいて単純にウィンドウ処理したかったので、次のようにしました。
.apply("Window", Window
.<Event>into(new GlobalWindows())
.triggering(Repeatedly
.forever(AfterProcessingTime
.pastFirstElementInPane()
.plusDelayOf(Duration.standardSeconds(5))
)
)
.withAllowedLateness(Duration.ZERO).discardingFiredPanes()
)
基本的に、これによりグローバルウィンドウが作成され、最初の要素が処理されてから5秒後にイベントを発行するようにトリガーされます。ウィンドウが閉じられるたびに、要素を受け取ると別のウィンドウが開かれます。 withAllowedLateness
のピースがない場合、Beamは文句を言いました。私が知る限り、これは最新のデータを無視するように指示しているだけです。
私の理解はここでは少し外れているかもしれませんが、上記のスニペットは私たちの問題を解決しました!