如何让GroupByKey触发早期结果,而不是等待所有数据到达(在我的情况下是相当长的时间)。我试图将我的输入PCollection拆分为具有早期触发器的窗口,但它只是不工作。在给出结果之前,它仍然等待所有数据到达。
PCollection<List<String>> input = ...
PCollection<KV<Integer,List<String>>> keyedInput = input.apply(ParDo.of(new AddArbitraryKey()))
keyedInput.apply(Window<KV<Integer,List<String>>>into(
FixedWindows.of(Duration.standardSeconds(1)))
.triggering(Repeatedly.forever(AfterWatermark.pastEndOfWindow()))
.withAllowedLateness(Duration.ZERO).discardingFiredPanes())
.apply(GroupByKey.<Integer,List<String>>create())
.apply(ParDo.of(new RemoveArbitraryKey()))
.apply(ParDo.of(new FurtherProcessing())
我这样做是为了防止fusing。 AddArbitraryKey变换使用Timestamp输出其元素。但是,GroupByKey会保留所有数据,直到所有数据到达(对于所有窗口)。有人可以告诉我如何让它早点触发。谢谢 。
答案 0 :(得分:1)
您可以安装类似
的触发器Repeatedly
.forever(AfterProcessingTime
.pastFirstElementInPane()
.plusDuration(Duration.standardMinutes(1))
.orFinally(AfterWatermark.pastEndOfWindow())
.discardingFiredPanes()
或者
AfterWatermark.pastEndOfWindow()
.withEarlyFirings(
AfterProcessingTime
.pastFirstElementInPane()
.plusDuration(Duration.standardMinutes(1))
答案 1 :(得分:1)
为防止融合,最好使用效果更好的变换Reshuffle.viaRandomKey()
,并确保不会引入任何额外的触发延迟。