Java 时间特性与;ApacheFlink中的TimerService

Java 时间特性与;ApacheFlink中的TimerService,java,apache-flink,flink-streaming,Java,Apache Flink,Flink Streaming,我目前正在ApacheFlink中进行流上处理,对StreamEnvironment的时间特性如何影响流中数据值的顺序以及ProcessFunction的onTimer函数调用的时间有点困惑 在本教程中,他们将特征设置为EventTime,因为我们希望根据开始和结束事件存储的时间而不是在流中接收到的时间来比较它们 现在,他们将timerService设置为在每个键的事件时间戳后2小时触发 真正让我困惑的是,当这个计时器在运行时实际启动时。 我提出的可能解释是: 将TimeCharacterist

我目前正在ApacheFlink中进行流上处理,对StreamEnvironment的时间特性如何影响流中数据值的顺序以及ProcessFunction的onTimer函数调用的时间有点困惑

在本教程中,他们将特征设置为
EventTime
,因为我们希望根据开始和结束事件存储的时间而不是在流中接收到的时间来比较它们

现在,他们将timerService设置为在每个键的事件时间戳后2小时触发

真正让我困惑的是,当这个计时器在运行时实际启动时。 我提出的可能解释是:

TimeCharacteristics
设置为
EventTime
可使流处理按其事件时间戳排序的条目,这样,当事件到达时,可以为每个RIDEI触发计时器,事件带有
timestamp>RIDEI.timestamp+2小时(来自练习上下文的2小时)

但是根据这种解释,出租车的startEvent总是在endEvent之前处理(我假设一次乘坐不能在它开始之前结束),我们不必像processElement函数中那样检查匹配的endEvent是否已经到达

ProcessFunction中,它们声明调用了计时器

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

但是,由于我们有一个(可能无限)的数据流,我们不关心数据点何时到达,而只关心它发生的时间,我们如何确保在未来某个地方不会出现一个匹配的数据点来触发练习中规定的2小时标准


如果有人能给我一个解释或者纠正我的错误,我们将不胜感激。

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

使用事件时间时,事件通常按顺序处理,您正在使用的练习就是这种情况。通常,水印用于标记事件时间的流逝——水印以时间戳t为特征,并指示流现在在时间t之前已完成(意味着所有早期事件都已处理)。在培训练习中,TaxiRideSource将根据您希望的无序程度进行参数化,并且TaxiRideSource会注意发出适当延迟的水印


您可以阅读更多信息。

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

使用事件时间时,事件通常按顺序处理,您正在使用的练习就是这种情况。通常,水印用于标记事件时间的流逝——水印以时间戳t为特征,并指示流现在在时间t之前已完成(意味着所有早期事件都已处理)。在培训练习中,TaxiRideSource将根据您希望的无序程度进行参数化,并且TaxiRideSource会注意发出适当延迟的水印


您可以阅读更多信息。

我并不完全了解水印的概念。因此,如果我没有弄错,那么这个练习的示例解决方案实际上不会考虑文档中描述的“延迟元素”,如果流会发出其中一些元素,因为允许延迟的默认时间设置为0,“延迟”元素是指在时间戳较大的水印之后到达的元素。例如,您的水印可能会假设所有事件将以最多60秒的延迟到达,在这种情况下,延迟80秒的事件将延迟。出租车驾驶练习避免创建任何迟到事件,因此不必费心配置允许的迟到时间。我明白了,这就是我在阅读文档中的水印后的设想。非常感谢你的帮助!我不清楚水印是否真的是:(1)作业操作员(例如,源操作员)发出的特殊/独立记录/事件**,并作为独立记录遍历数据流。。。或者(2)作业操作符知道如何根据assignTimeStampAndWatermarks的逻辑生成它们,因此它们实际上不会独立地遍历数据流图。在(1)的情况下,水印是否会无序到达下游运营商。水印最初由源或水印生成器(在运行TimeStampandWatermarks的运营商中)创建。它们是
StreamElement
的一种类型,它们确实作为独立记录遍历数据流。具有多个输入流的操作员跟踪来自每个输入的最新(最高)水印,将其自己的当前水印设置为这些传入水印的最小值,并将其自己的当前水印发送到下游。从来没有一个数据流中的水印是反向的——它们只会上升。我并不完全了解水印使用的概念。因此,如果我没有弄错,那么这个练习的示例解决方案实际上不会考虑文档中描述的“延迟元素”,如果流会发出其中一些元素,因为允许延迟的默认时间设置为0,“延迟”元素是指在时间戳较大的水印之后到达的元素。例如,您的水印可能会假设所有事件将以最多60秒的延迟到达,在这种情况下,延迟80秒的事件将延迟。出租车骑乘练习可避免造成任何迟到