及时流处理#
介绍#
及时流处理是有状态流处理其中时间在计算中起了一些作用。在进行时间序列分析时,基于特定时间段(通常称为窗口)进行聚合时,或者在事件发生时间非常重要的情况下进行事件处理时,都会出现这种情况。
在接下来的章节中,我们将重点介绍在使用适时Flink应用程序时应该考虑的一些主题。
返回页首
时间的概念:事件时间和处理时间#
当提到流程序中的时间时(例如定义窗口),人们可以提到不同的概念时间:
处理时间:处理时间是指执行相应操作的机器的系统时间。
当串流程序在处理时间运行时,所有基于时间的操作(如时间窗口)都将使用运行相应操作符的机器的系统时钟。每小时处理时间窗口将包括在系统时钟指示整小时的时间间隔内到达特定操作员的所有记录。例如,如果应用程序在上午9:15开始运行,则第一个每小时处理时间窗口将包括上午9:15到10:00之间处理的事件,下一个窗口将包括上午10:00到11:00之间处理的事件,依此类推。
处理时间是最简单的时间概念,不需要流和机器之间的协调。它提供最佳性能和最低延迟。但是,在分布式和异步环境中,处理时间并不具有确定性,因为它容易受到记录到达系统的速度(例如从消息队列)、记录在系统内部操作员之间流动的速度以及停机(计划的或其他方式)的影响。
活动时间:事件时间是每个单独事件在其产生设备上发生的时间。该时间通常在记录进入Flink之前嵌入记录中事件时间戳可以从每个记录中提取。在事件时间中,时间的进展取决于数据,而不是任何挂钟。事件时间程序必须指定如何生成事件时间水印,这是在事件时间内发出进度信号的机制。这种水印机制将在后面的章节中描述,在下面.
在理想情况下,事件时间处理将产生完全一致和确定的结果,而不管事件何时到达或它们的顺序如何。但是,除非已知事件按顺序到达(通过时间戳),否则事件时间处理在等待无序事件时会产生一些延迟。由于只能等待一段有限的时间,这限制了事件时间应用程序的确定性。
假设所有数据都已到达,事件时间操作将按预期运行,即使在处理无序或延迟事件时,或者在重新处理历史数据时,也会产生正确和一致的结果。例如,每小时事件时间窗口将包含事件时间戳在该小时内的所有记录,而不管它们到达的顺序或处理时间。(请参见迟了解更多信息。)
请注意,有时当事件时间程序实时处理实时数据时,它们会使用一些处理时间操作,以保证它们及时进行。
Event Time and Processing Time
返回页首
事件时间和水印#
注意:Flink实现了数据流模型中的许多技术。有关事件时间和水印的详细介绍,请查看下面的文章。
流媒体101泰勒·阿基多
这数据流模型纸
一种流处理器,支持事件时间需要一种方法来测量事件时间的进度。例如,构建每小时窗口的窗口操作员需要在事件时间超过一小时结束时得到通知,以便操作员可以关闭正在进行的窗口。
事件时间可以独立于处理时间(通过挂钟测量)。例如,在一个程序中,当前事件时间运算符的可能稍微落后于处理时间(考虑到接收事件的延迟),同时两者以相同的速度进行。另一方面,另一个流程序可能通过快进Kafka主题(或另一个消息队列)中已经缓冲的一些历史数据,在几秒钟的处理时间内处理数周的事件。
Flink中衡量事件时间进度的机制是水印。水印作为数据流的一部分流动并带有时间戳t。A水印声明事件时间已到t这意味着流中不应该再有带有时间戳的元素t‘《= t(即时间戳早于或等于水印的事件)。
下图显示了带有(逻辑)时间戳和水印的事件流。在这个例子中,事件是有序的(相对于它们的时间戳),这意味着水印只是流中的周期性标记。
A data stream with events (in order) and watermarks
水印对于以下方面至关重要无序的如下图所示,流中的事件不是按时间戳排序的。一般来说,水印是一种声明,表明在流中的该点之前,直到某个时间戳的所有事件都应该已经到达。一旦水印到达操作者,操作者可以推进其内部事件时钟水印的值。
A data stream with events (out of order) and watermarks
请注意,事件时间是由新创建的流元素(或多个元素)从产生它们的事件或触发这些元素创建的水印中继承的。
并行流中的水印#
水印是在源函数处或直接在源函数之后生成的。源函数的每个并行子任务通常独立生成水印。这些水印定义了特定并行源的事件时间。
当水印流经流媒体程序时,它们会提前到达运营商处的事件时间。每当一个操作符提前其事件时间时,它都会为其后续操作符生成一个新的下游水印。
一些操作符消耗多个输入流;例如,一个联合,或者跟在键盘侠(…)或者分区(…)功能。这种操作符的当前事件时间是其输入流事件时间的最小值。随着输入流更新事件时间,操作符也会更新。
下图显示了流经并行流的事件和水印以及跟踪事件时间的操作员的示例。
Parallel data streams and operators with events and watermarks
迟#
某些元素可能会违反水印条件,这意味着即使在水印已发生,更多元素带有时间戳t‘《= t会发生。事实上,在许多现实世界的设置中,某些元素可以被任意延迟,这使得不可能指定某个事件时间戳的所有元素都将发生的时间。此外,即使可以限制延迟,将水印延迟太多通常也是不可取的,因为这会在事件时间窗口的评估中造成太多延迟。
出于这个原因,流媒体程序可能会明确地期待一些晚元素。延迟元素是在系统的事件时钟(由水印指示)已经超过延迟元素的时间戳时间之后到达的元素。看见允许迟到有关如何在事件时间窗口中使用晚期元素的更多信息。
开窗术#
聚合事件(例如计数、求和)在流上的工作方式不同于批处理。例如,不可能计算一个流中的所有元素,因为流通常是无限的(无界的)。相反,流上的聚合(计数、总和等)的范围是窗子,比如“计算过去5分钟的时间“,或者“最后100个元素的总和“.
窗户可以是时间驱动(例如:每30秒)或数据驱动(例如:每100个元素)。人们通常区分不同类型的窗口,例如翻滚的窗户(无重叠),滑动窗口(有重叠),以及会话窗口(中间有一段不活动的间隙)。
Time- and Count Windows
标签:元素,窗口,处理,Flink,水印,时间,事件 From: https://www.cnblogs.com/huft/p/18249376