flink流窗口触发器

时间:2017-06-06 14:50:25

标签: scala apache-flink flink-streaming

我有眨眼流,我在某个时间窗口说30秒钟就可以了解一些事情。

这里发生了什么,它给了我结果我聚合以前的窗口。

说前30秒我得到结果10。

下一个秒我想要新结果,而不是我得到最后一个窗口结果+新 等等。

所以我的问题是如何为每个窗口获得新的结果。

3 个答案:

答案 0 :(得分:3)

您需要使用purging触发器。你想要的是FIRE_AND_PURGE(发出和删除窗口内容),默认的flink触发器做的是FIRE(发出并保持窗口内容)。

input
    .keyBy(...)
    .timeWindow(Time.seconds(30))

    // The important part: Replace the default non-purging ProcessingTimeTrigger
    .trigger(new PurgingTrigger[..., TimeWindow](ProcessingTimeTrigger))

    .reduce(...)

如需更深入的解释,请查看TriggersFIRE vs FIRE_AND_PURGE

  

触发器确定何时窗口功能准备好处理窗口(由窗口分配器形成)。每个WindowAssigner都带有一个默认触发器。如果默认触发器不符合您的需要,您可以使用触发器(...)指定自定义触发器。

     

当触发器触发时,它可以是FIRE或FIRE_AND_PURGE。当FIRE 保留窗口内容时,FIRE_AND_PURGE 会删除其内容。默认情况下,预先实现的触发器只是FIRE而不会清除窗口状态。

答案 1 :(得分:0)

您所描述的功能可在Tumbling Windows中找到:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/windows.html#tumbling-windows

更多细节和/或代码会有所帮助:)

答案 2 :(得分:0)

这个问题我来不晚,但是我遇到了OP的同样问题。后来我发现是我自己的代码中的错误。仅供参考,我的错误可以为您的问题提供很好的参考。

// Old code (modified to be an example):
val tenSecondGrouping: DataStream[MyCustomGrouping] = userIdsStream
      .keyBy(_.somePartitionedKey)
      .window(TumblingProcessingTimeWindows.of(Time.of(10, TimeUnit.SECONDS)))
      .trigger(ProcessingTimeTrigger.create())
      .aggregate(new MyCustomAggregateFunc(new MyCustomGrouping()))

错误发生在新的MyCustomGrouping :我无意中创建了一个单例MyCustomGrouping对象,并在MyCustomAggregateFunc中重用了该对象。随着创建更多滚动窗口,后来的聚合结果变得疯狂!解决方法是每次触发MyCustomAggregateFunc时都创建新的MyCustomGrouping。所以:

// New code, problem solved
          ...
          .aggregate(new MyCustomAggregateFunc(() => new MyCustomGrouping())) 
// passing in a func to create new object per trigger