我目前正在研究这个关于Apache Flink中的流处理的tutorial,并且对于StreamEnvironment的TimeCharacteristics如何影响流中数据值的顺序以及关于ProcessFunction的onTimer函数被调用的时间有点困惑。
在本教程中,他们将特征设置为EventTime
,因为我们希望根据它们存储的时间比较开始和结束事件,而不是在流中接收它们的时间。
现在在reference solution中,他们设置了一个timerService,在每个键的事件时间戳之后2小时触发。
真正令我困惑的是这个计时器在运行时实际触发的时候。我想出的可能的解释:
将TimeCharacteristics
设置为EventTime
使得流处理按事件时间戳排序的条目,这样,当事件到达时,timestamp > rideId.timeStamp + 2 hours
(来自运动上下文的2小时)可以为每个rideId触发计时器。
但是通过这个解释,一个出租车的startEvent总是会在endEvent之前被处理(我假设一个骑行不能在它开始之前结束),我们不必检查匹配的EndEvent是否已经到达他们在processElement函数中执行。
在documentation的ProcessFunction
中,他们声明计时器被调用
“当达到计时器的特定时间时”
但是因为我们有一个(可能是无限的)数据流,我们不关心数据点何时到达,但只有当它发生时,我们怎么能确定将来某个地方的startEvent不会到达匹配的数据点这将在练习中说明2个小时的标准?
如果有人可以给我一个解释,或者纠正我错在哪里,我将非常感激。
当Flink确信已经处理了时间戳早于计时器中的时间的所有事件时,事件时间计时器将触发。这是通过等待当前水印达到计时器中指定的时间来完成的。
处理事件时,事件通常是乱序处理的,在您正在使用的练习中就是这种情况。通常,水印用于标记事件时间的通过 - 水印以时间戳t为特征,并且指示流现在在时间t内完成(意味着所有早期事件已经被处理)。在训练练习中,TaxiRideSource根据您想要的无序程度进行参数化,TaxiRideSource负责发出适当延迟的水印。
您可以阅读更多关于event time and watermarks in the Flink documentation的信息。