GroupByKey变换的早期结果

时间:2018-02-20 13:57:15

标签: google-cloud-dataflow apache-beam

如何让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会保留所有数据,直到所有数据到达(对于所有窗口)。有人可以告诉我如何让它早点触发。谢谢 。

2 个答案:

答案 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(),并确保不会引入任何额外的触发延迟。