我目前正在用apache flink学习这个关于流处理的教程,对于streamenvironment的timecharacteristics如何影响流中数据值的顺序以及调用processfunction的ontimer函数的时间有点困惑。
在教程中,他们将特征设置为 EventTime
,因为我们希望根据事件存储的时间而不是流中接收到的时间来比较开始和结束事件。
现在在参考解决方案中,他们将timerservice设置为在每个键的事件时间戳后2小时触发。
真正让我困惑的是,这个计时器在运行时实际触发的时间。可能的解释是:
设置 TimeCharacteristics
至 EventTime
使流处理按事件时间戳排序的条目,这样,当事件到达时,可以为每个rideid触发计时器 timestamp > rideId.timeStamp + 2 hours
(2小时来自练习环境)。
但是根据这个解释,出租车的starteEvent总是在endevent之前处理(我假设一次乘坐不能在它开始之前结束),并且我们不必像processelement函数中那样检查匹配的endevent是否已经到达。
在文件中 ProcessFunction
它们表示计时器被调用
“达到计时器的特定时间时”
但是,既然我们有一个(可能无限的)数据流,而且我们不关心数据点何时到达,而只关心它何时发生,那么我们如何确保在未来某个地方不会有一个匹配的数据点到达startevent,而该数据点将在练习中规定的2小时内触发标准?
如果有人能给我一个解释或者纠正我的错误,我将不胜感激。
1条答案
按热度按时间xlpyo6sf1#
当flink确信时间戳早于计时器中时间的所有事件都已被处理时,就会触发事件时间计时器。这是通过等待当前水印达到计时器中指定的时间来完成的。
在使用事件时间时,事件通常是无序处理的,您正在使用的练习就是这种情况。一般来说,水印用于标记事件时间的流逝——水印的特征是时间戳t,并指示流现在在时间t之前是完整的(意味着所有先前的事件都已经被处理)。在训练练习中,taxiridesource会根据您希望的无序程度进行参数化,并且taxiridesource会注意发出适当延迟的水印。
您可以在flink文档中阅读更多关于事件时间和水印的信息。