Apache Flink中的TimeCharacteristics和TimerService

问题描述 投票:0回答:1

我目前正在研究这个关于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函数中执行。

documentationProcessFunction中,他们声明计时器被调用

“当达到计时器的特定时间时”

但是因为我们有一个(可能是无限的)数据流,我们不关心数据点何时到达,但只有当它发生时,我们怎么能确定将来某个地方的startEvent不会到达匹配的数据点这将在练习中说明2个小时的标准?

如果有人可以给我一个解释,或者纠正我错在哪里,我将非常感激。

java apache-flink flink-streaming
1个回答
1
投票

当Flink确信已经处理了时间戳早于计时器中的时间的所有事件时,事件时间计时器将触发。这是通过等待当前水印达到计时器中指定的时间来完成的。

处理事件时,事件通常是乱序处理的,在您正在使用的练习中就是这种情况。通常,水印用于标记事件时间的通过 - 水印以时间戳t为特征,并且指示流现在在时间t内完成(意味着所有早期事件已经被处理)。在训练练习中,TaxiRideSource根据您想要的无序程度进行参数化,TaxiRideSource负责发出适当延迟的水印。

您可以阅读更多关于event time and watermarks in the Flink documentation的信息。

© www.soinside.com 2019 - 2024. All rights reserved.