本篇内容主要讲解“Flink的时间特性有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flink的时间特性有哪些”吧!
Flink DataStream程序的第一部分通常设置基本时间特性。
该设置定义了数据流源的行为方式(例如,它们是否将分配时间戳),以及像KeyedStream.timeWindow(Time.seconds(30))这样的窗口操作应该使用什么时间概念。
Flink在流处理程序中支持不同的时间概念。
默认,无需指定
是指执行相应操作的机器的系统时间。
当流处理程序基于处理时间运行时,所有基于时间的操作(如时间窗口)将使用运行相应运算符的机器的系统时钟。 每小时处理时间窗口将包括在系统时钟指示整个小时之间到达特定运算符的所有记录。 例如,如果应用程序在上午9:15开始运行,则第一个每小时处理时间窗口将包括在上午9:15到10:00之间处理的事件,下一个窗口将包括在上午10:00到11:00之间处理的事件,以此类推。
处理时间是最简单的时间概念,不需要流和机器之间的协调。 它提供最佳性能和最低延迟。 但是,在分布式和异步环境中,处理时间不提供确定性,因为它容易受到记录到达系统的速度(例如从消息队列),记录在系统内的运算符之间流动的速度的影响,以及停电(计划或其他)。
事件时间,是每个事件在其生产设备上发生的时间。
通俗理解就是Flink接收的数据中某个字段指定的时间,如接收的Map对象,里面有个eventtime字段或者有个createdate字段;
由于系统不知道具体哪一个是表示EventTime,所以需要业务写代码的时候指定好。
Flink中用于衡量事件时间进度的机制是水印。 水印作为数据流的一部分流动并带有时间戳t。 Watermark(t)声明事件时间已到达该流中的时间t,这意味着不应该有来自流的具有时间戳t’<= t的元素(即,具有更早或等于水印的时间戳的事件)。
此时间通常在进入Flink之前嵌入记录中,并且可以从每个记录中提取该事件时间戳。 在事件时间,时间的进展取决于数据,而不是任何时钟。 事件时间程序必须指定如何生成事件时间水印,这是表示事件时间进度的机制。 该水印机制在下面的后面部分中描述。
在一个完美的世界中,事件时间处理将产生完全一致和确定的结果,无论事件何时到达或其它们的顺序。 但是,除非事件已知按顺序到达(按时间戳),否则事件时间处理会在等待无序事件时产生一些延迟。 由于只能等待一段有限的时间,因此限制了确定性事件时间应用程序的运行方式。
假设所有数据都已到达,事件时间操作将按预期运行,即使在处理无序或延迟事件或重新处理历史数据时也会产生正确且一致的结果。 例如,每小时事件时间窗口将包含带有落入该小时的事件时间戳的所有记录,无论它们到达的顺序如何,或者何时处理它们。 (有关更多信息,请参阅有关迟到事件的部分。)
请注意,有时基于事件时间的程序处理实时数据时,它们将使用一些处理时间(processing time)操作,以保证它们及时进行。
进入时间,是事件进入Flink的时间,即Flink消费到数据的时间。
假设Flink由于某些原因导致延时了,那么进入时间相应的也会延时,看具体的场景选择使用。
在源运算符处,每个记录将源的当前时间作为时间戳,并且基于时间的操作(如时间窗口)引用该时间戳。
进入时间在概念上位于事件时间和处理时间之间。与处理时间相比,它代价稍高,但可以提供更可预测的结果。 因为进入时间使用稳定的时间戳(在源处分配一次),所以对记录的不同窗口操作将引用相同的时间戳,而在处理时间中,每个窗口操作符可以将记录分配给不同的窗口(基于本地系统时钟和 任何传输延误)。
到此,相信大家对“Flink的时间特性有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。