我目前正在学习这个关于Apache Flink中的流处理的教程,并且对StreamEnvironment的时间特征如何影响流中数据值的顺序以及调用ProcessFunction的onTimer 函数的时间有点困惑。
在教程中,他们将特征设置为EventTime
,因为我们想根据它们存储的时间而不是它们在流中接收的时间来比较开始和结束事件。
现在,在参考解决方案中,他们将 timerService 设置为在每个键的事件时间戳后 2 小时触发。
真正让我感到困惑的是,这个计时器在运行时实际触发。 我想出的可能解释:
将TimeCharacteristics
设置为EventTime
会使流处理按事件时间戳排序的条目,这样,当事件到达时,可以为每个 rideId 触发计时器,并带有timestamp > rideId.timeStamp + 2 hours
(来自锻炼上下文的 2 小时)。
但是有了这个解释,出租车乘车的 startEvent 总是在 endEvent 之前处理(我假设乘车不能在开始之前结束),我们不必像在 processElement 函数中那样检查匹配的 EndEvent 是否已经到达。
在ProcessFunction
的文档中,他们指出计时器被称为
"当达到计时器的特定时间时">
但是由于我们有一个(可能是无限的)数据流,我们不关心数据点何时到达,而只关心它何时发生,我们如何确定将来某个地方不会有一个匹配的数据点来触发练习中规定的 2 小时的标准?
如果有人能将我链接到对此的解释或纠正我错的地方,将不胜感激。
当 Flink 确信时间戳早于计时器中时间的所有事件都已处理时,将触发事件时间计时器。这是通过等待当前水印达到计时器中指定的时间来完成的。
使用事件时间时,事件通常会无序处理,在您正在使用的练习中就是这种情况。通常,水印用于标记事件时间的经过 - 水印的特征是时间戳 t,并指示流现在已完成时间 t(意味着所有早期事件都已处理)。在训练练习中,TaxiRideSource根据您想要的无序程度进行参数化,并且TaxiRideSource会注意发出适当的延迟水印。
您可以在 Flink 文档中阅读有关事件时间和水印的更多信息。