应用window函数会丢弃结果中的事件

时间:2019-01-16 19:44:39

标签: apache-flink flink-streaming

我正在尝试计算流中的元素,同时用窗口的结束时间丰富结果。

使用flink提供的kafka10使用者从Kafka接收事件。使用EventTime。 一个简单的KeyedStream.count(...)可以正常工作。 流的长度为4分钟。通过使用3分钟的时间窗口,仅接收到一个输出。应该有两个。结果是使用BucketingSink编写的。

val count = stream.map( m => (m.getContext, 1) )
    .keyBy( 0 )
    .timeWindow( Time.minutes(3) )
    .apply( new EndTimeWindow() )
    .map( new JsonMapper() )
count.addSink( countSink )
class EndTimeWindow extends WindowFunction[(String,Int),(String, Int),Tuple, TimeWindow]{
    override def apply(key: Tuple, window: TimeWindow, input: Iterable[(String, Int)], out: Collector[(String, Int)]): Unit =  {
        var sum: Int = 0
        for( value <-input ) {
            sum = sum + value._2;
        }
        out.collect( (window.getEnd.toString, new Integer(sum ) ))
    }
}

通过使用3分钟的时间窗口,只能接收到事件量较小的一个输出。应该有两个输出。

2 个答案:

答案 0 :(得分:0)

好的,我想,我知道出了什么问题。发生错误是因为我对这个问题有误。 由于我使用的是Eventtime,因此当事件到达时其时间戳大于窗口结束时间时,窗口将关闭。当流结束时,不再有任何元素。因此,该窗口永远不会关闭。

答案 1 :(得分:0)

更准确地说,事件时间窗口会在到达合适的水印时关闭-带有无序水印生成器的事件时间窗口将发生(1)如果事件到达的时间足够在窗口外,或(2)如果事件来自到达其末尾的有限来源,因为在这种情况下,Flink将发送带有Long.MAX_VALUE时间戳的水印,该水印将关闭所有打开的事件时间窗口。但是,以Kafka作为来源,就不会发生。