这个例子一开始非常有用,它说明了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 IS ProcessingTime 由正在运行的机器的系统时钟确定,根据 ProcessingTime 属性,水印不会随时间变化,因此这意味着永远不会调用 onTimer ,除非 TimeCharacteristics 更改为 eventTime
根据flink网站: 每小时处理时间窗口将包括在系统时钟指示整小时的时间之间到达特定操作员的所有记录。例如,如果应用程序在上午 9:15 开始运行,则第一个每小时处理时间窗口将包括在上午 9:15 到上午 10:00 之间处理的事件,下一个窗口将包括在上午 10:00 到上午 11:00 之间处理的事件,依此类推。 如果水印没有随时间变化,是否会触发窗口功能?因为触发窗口的条件是水印进入窗口的结束时间
我想知道触发窗口的条件是否取决于PriocessingTime中的水印,即使官方网站根本没有提到这一点,也会根据处理时间来触发窗口
希望有人能花一点时间在这上面,非常感谢!
让我试着澄清几件事:
Flink 提供了两种定时器:事件时间定时器和处理定时器。事件计时器由等于或大于计时器时间戳的水印到达触发,处理时间计时器由系统时钟到达计时器的时间戳触发。
水印仅在执行事件时间处理时才相关,它们的唯一用途是触发事件时间计时器。它们在你提到的本数据流 API 代码演练中的应用程序中完全不起作用。如果此应用程序直接或间接使用事件时间计时器(通过使用事件时间窗口,或通过 SQL 或 CEP 等更高级别 API 之一(,则需要水印。但由于它只使用处理时间计时器,因此对水印没有用处。
顺便说一句,这个欺诈检测示例没有使用 Flink 的 Window API,因为 Flink 的窗口机制不太适合这个应用程序的要求。在这里,我们试图将模式与特定时间范围内的事件序列相匹配——所以我们想要一个不同类型的"窗口",它从一个特殊的触发事件(在本例中是一个小交易(的时刻开始,而不是一个与时钟对齐的TimeWindow
(如 Flink 的 Window API 提供的那些((即 上午 10:00 至上午 10:01(。