我正在尝试计算流中的元素,同时用窗口的结束时间丰富结果。
使用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分钟的时间窗口,只能接收到事件量较小的一个输出。应该有两个输出。
答案 0 :(得分:0)
好的,我想,我知道出了什么问题。发生错误是因为我对这个问题有误。 由于我使用的是Eventtime,因此当事件到达时其时间戳大于窗口结束时间时,窗口将关闭。当流结束时,不再有任何元素。因此,该窗口永远不会关闭。
答案 1 :(得分:0)
更准确地说,事件时间窗口会在到达合适的水印时关闭-带有无序水印生成器的事件时间窗口将发生(1)如果事件到达的时间足够在窗口外,或(2)如果事件来自到达其末尾的有限来源,因为在这种情况下,Flink将发送带有Long.MAX_VALUE时间戳的水印,该水印将关闭所有打开的事件时间窗口。但是,以Kafka作为来源,就不会发生。