这是我参与「第四届青训营 」笔记创作活动的第4天
时间概念:事件时间和处理时间
-
处理时间: 处理时间是指执行相应操作的计算机的系统时间。
当流程序在处理时间运行时,所有基于时间的操作(如时间窗口)都将使用运行相应运算符的计算机的系统时钟。每小时处理时间窗口将包括系统时钟指示完整小时的时间之间到达特定操作员的所有记录。例如,如果应用程序在上午 9:15 开始运行,则第一个每小时处理时间窗口将包括在上午 9:15 和 10:00 之间处理的事件,下一个窗口将包括在上午 10:00 到上午 11:00 之间处理的事件,依此类推。
处理时间是最简单的时间概念,不需要流和机器之间的协调。它提供最佳性能和最低延迟。但是,在分布式和异步环境中,处理时间不提供确定性,因为它容易受到记录到达系统的速度(例如,从消息队列)、记录在系统内部操作员之间流动的速度以及中断(计划或其他方式)的影响。
-
事件时间: 事件时间是每个单独事件在其生产设备上发生的时间。此时间通常嵌入到记录中,然后输入 Flink,并且可以从每条记录中提取该事件时间戳。在事件时间中,时间的进度取决于数据,而不是任何挂钟。事件时间程序必须指定如何生成事件时间水位线,这是在事件时间中发出进度信号的机制。
在理想情况下,事件时间处理将产生完全一致和确定性的结果,无论事件何时到达或其顺序。但是,除非已知事件按顺序(按时间戳)到达,否则事件时间处理在等待无序事件时会产生一些延迟。由于只能等待有限的时间段,因此这限制了事件时间应用程序的确定性。
假设所有数据都已到达,事件时间操作将按预期运行,并生成正确且一致的结果,即使在处理无序或延迟事件时,或在重新处理历史数据时也是如此。例如,每小时事件时间窗口将包含带有落入该小时的事件时间戳的所有记录,无论这些记录以何种顺序到达或何时处理。(有关详细信息,请参阅有关迟到的部分。
请注意,有时当事件时间程序实时处理实时数据时,它们将使用一些处理时间操作来保证它们及时进行。
事件时间和水位线
Flink 中用于测量事件时间进度的机制是水位线。水位线作为数据流的一部分流动,并带有时间戳 t。水位线(t) 声明事件时间已达到该流中的时间 t,这意味着流中不应再有时间戳为 t' <= t 的元素(即时间戳早于或等于水印的事件)。
下图显示了具有(逻辑)时间戳和内联流水位线的事件流。在此示例中,事件是有序的(相对于其时间戳),这意味着水位线只是流中的周期性标记。
水位线对于无序流至关重要,如下图所示,其中事件不按时间戳排序。通常,水位线是一种声明,即到流中的该点,直到某个时间戳的所有事件都应已到达。一旦水位线到达操作员,操作员就可以将其内部事件时间时钟提升到水位线的值。
请注意,事件时间由新创建的一个或多个流元素继承,该元素来自产生这些元素的事件或触发这些元素创建的水位线。
平行流中的水位线#
水位线在源函数处或紧随源函数之后生成。源函数的每个并行子任务通常独立生成其水位线。这些水位线定义该特定并行源的事件时间。
当水位线流经流媒体程序时,它们会提前到达的运营商处的事件时间。每当操作员提前其事件时间时,它就会为其后续操作员在下游生成一个新的水位线。
一些运营商使用多个输入流;例如,一个联合,或 keyBy(...) 或 partition(...) 函数后面的运算符。此类运算符的当前事件时间是其输入流的事件时间的最小值。当其输入流更新其事件时间时,运算符也会更新。
下图显示了流经并行流的事件和水位线的示例,以及跟踪事件时间的算子。
\