这个例子一开始非常有用,它说明了keyedprocessfunction是如何在flink中工作的。有一些值得注意的事情,我突然想到。。。它来自于欺诈探测器v2:状态+时间部分,考虑到实际的应用需求部分,在这里设置一个计时器是合理的
override def onTimer(
timestamp: Long,
ctx: KeyedProcessFunction[Long, Transaction, Alert]#OnTimerContext,
out: Collector[Alert]): Unit = {
// remove flag after 1 minute
timerState.clear()
flagState.clear()
}
问题是:
timecharacteristic是由运行机器的系统时钟决定的processingtime,根据processingtime属性,水印不会超时更改,这意味着永远不会调用ontimer,除非timecharacteristic更改为eventtime
flink网站称:每小时处理时间窗口将包括在系统时钟指示整小时的时间间隔内到达特定操作员的所有记录。例如,如果应用程序在上午9:15开始运行,则第一个小时处理时间窗口将包括上午9:15到上午10:00之间处理的事件,下一个窗口将包括上午10:00到上午11:00之间处理的事件,依此类推。如果水印不随时间变化,是否会触发窗口功能?因为触发窗口的条件是水印进入窗口的结束时间
我想知道窗口被触发与否的条件并不取决于预处理时间的水印,尽管官方网站根本没有提到,但触发窗口的条件将取决于处理时间
希望有人能花点时间在这上面,谢谢!
1条答案
按热度按时间4xrmg8kj1#
让我试着澄清几件事:
flink提供两种计时器:事件时间计时器和处理时间计时器。事件时间计时器由等于或大于计时器时间戳的水印的到达触发,并且处理时间计时器由到达计时器时间戳的系统时钟触发。
水印只有在进行事件时间处理时才相关,它们的唯一作用是触发事件时间计时器。它们在应用程序中根本不起任何作用,就像您提到的这个datastreamapi代码演练中的应用程序一样。如果此应用程序直接或间接(通过使用事件时间窗口,或通过sql或cep等更高级别的API之一)使用事件时间计时器,那么它将需要水印。但是由于它只使用处理时间计时器,所以它没有水印的用处。
顺便说一句,这个欺诈检测示例没有使用flink的windowapi,因为flink的窗口机制不适合这个应用程序的要求。在这里,我们试图将一个模式与特定时间范围内的一系列事件相匹配——因此我们需要一个不同类型的“窗口”,从一个特殊触发事件(在本例中是一个小事务)开始,而不是一个
TimeWindow
(类似于flink的窗口api提供的)与时钟对齐(即10:00am到10:01am)。