Apache flink 应用windowedFunction后,窗口中没有内容

Apache flink 应用windowedFunction后,窗口中没有内容,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我刚接触Flink,正在尝试做一些练习,当我使用带有kafka连接器的窗口时,我遇到了一个问题 代码如下所示: val env:StreamExecutionEnvironment=StreamExecutionEnvironment.getExecutionEnvironment ..... //以名称作为密钥的KeyedStream val eventsStream:KeyedStream[自定义对象,字符串]=环境 .addSource[CustomedObject](source.get

我刚接触Flink,正在尝试做一些练习,当我使用带有kafka连接器的窗口时,我遇到了一个问题

代码如下所示:

val env:StreamExecutionEnvironment=StreamExecutionEnvironment.getExecutionEnvironment
.....
//以名称作为密钥的KeyedStream
val eventsStream:KeyedStream[自定义对象,字符串]=环境
.addSource[CustomedObject](source.getSource)
.keyBy(c.get(“name”))
//使用事件时间定义滑动窗口赋值器
val windowedStream:windowedStream[CustomedObject,String,TimeWindow]=eventsStream.window(滑动EventTimeWindows.of(Time.seconds(2L),Time.seconds(1L)))
//应用窗口函数
val结果=windowedStream.apply(
(键、窗口、输入:Iterable[CustomedObject],输出:收集器[(字符串、时间窗口)])=>{
向外收集((钥匙、窗户))
}
)
问题:当我尝试事件流.print()时,控制台中有输出,但当我尝试结果.print()时,没有输出

信息: 密钥存在,并且在每个事件中都有值


有人能告诉我为什么没有每个窗口的内容输出吗?

当流的水印到达窗口的末尾时,会触发一个事件时间窗口。如果这种情况没有发生,那么可能是水印问题。源代码需要注意生成适当的水印,或者您需要在应用程序中实现这一点。有关这些主题的更多信息,请参阅和

更新了摘要,希望避免任何混淆:

事件时间戳和水印是长的,通常表示从纪元开始的毫秒,但事件时间是一个逻辑的、单调递增的时钟,Flink不关心这些值实际代表什么

与处理时间不同的是,事件时间会不断向前推进,直到被水印提前。当前水印是事件时间时钟的当前值,它通常滞后于迄今为止看到的某个有界延迟的最大时间戳(该延迟是在事件被视为延迟之前可容纳的最大无序度)

当应用程序在事件时间运行时,Flink需要知道与每个流元素关联的时间戳以及当前水印。时间戳提取器和水印生成器起到了这个作用,Flink提供了两种内置的方法,您可以扩展它们

除非您的数据源已经为您提取了时间戳,否则您将需要使用
assignerWithsportedWatermarks
AssignerWithPeriodicWatermarks
实现
提取时间戳(MyEvent元素,long previousElementTimestamp)
方法,Flink将调用每个流元素以获取其时间戳


这两者之间的区别在于
带有标点水印的赋值器
有一个checkAndGetNextWatermark()方法,该方法为每个流元素调用,期望某些元素是特殊的(如标点符号),并且这些特殊元素将用于生成水印。相比之下,对于
赋值器WithPeriodicWatermarks
,其getCurrentWatermark()方法每
ExecutionConfig.getAutoWatermarkInterval()
毫秒调用一次以生成水印,并期望某些状态作为调用extractTimestamp()的副作用而保留可用于生成水印的(
BoundedAutofordernessTimestampExtractor
通过记住到目前为止在流中看到的最大时间戳来实现这一点)。

当流的水印到达窗口的末尾时,将触发事件时间窗口。如果这种情况没有发生,那么可能是水印问题。源代码需要注意生成适当的水印,或者您需要在应用程序中实现这一点。有关这些主题的更多信息,请参阅和

更新了摘要,希望避免任何混淆:

事件时间戳和水印是长的,通常表示从纪元开始的毫秒,但事件时间是一个逻辑的、单调递增的时钟,Flink不关心这些值实际代表什么

与处理时间不同的是,事件时间会不断向前推进,直到被水印提前。当前水印是事件时间时钟的当前值,它通常滞后于迄今为止看到的某个有界延迟的最大时间戳(该延迟是在事件被视为延迟之前可容纳的最大无序度)

当应用程序在事件时间运行时,Flink需要知道与每个流元素关联的时间戳以及当前水印。时间戳提取器和水印生成器起到了这个作用,Flink提供了两种内置的方法,您可以扩展它们

除非您的数据源已经为您提取了时间戳,否则您将需要使用
assignerWithsportedWatermarks
AssignerWithPeriodicWatermarks
实现
提取时间戳(MyEvent元素,long previousElementTimestamp)
方法,Flink将调用每个流元素以获取其时间戳

这两者之间的区别在于
带有标点水印的赋值器
有一个checkAndGetNextWatermark()方法,该方法为每个流元素调用,期望某些元素是特殊的(如标点符号),并且这些特殊元素将用于生成水印。相比之下,对于具有周期性水印的赋值器,其getCurrentWatermark()方法每隔
ExecutionConfig.getAutoWatermarkInterval()
毫秒调用一次,以生成水印,期望某些状态