流处理中主要有三个时间概念,分别是事件时间、处理时间、摄取时间。
事件时间是指事件实际发生的事件。更准确地说,每一个时间都有一个与它相关的时间戳,并且时间戳是数据记录的一部分。
处理时间是指事件被粗粝的事件。处理时间其实就是处理事件的机器所测量的时间。
摄取时间,也叫做进入时间,是指事件进入流处理框架的事件。缺乏真实事件时间的数据会被流处理器附上事件戳,即流处理器第一次看到它的事件。
在现实世界中,许多因素使得事件时间和处理事件存在偏差。事件时间顺序和处理时间顺序通常不一致,这意味着时间以乱序到达流处理器。根据应用程序的不同,两个时间概念都很有用。有些应用程序需要尽可能快地得到结果,即使有小的误差也没关系。他们不必等待迟到的时间,因此适合采用处理时间语义。其他一些应用程序则对准确性有要求:只有在时间窗口内发生的时间才能被算进来。对于这些应用程序来说,事件时间语义才是正确的选择。也有两者都采用的情况,比如既要准确的计数,又要提供异常预警。
Flink允许用户根据所需的寓意和准确性的要求选择采用事件时间、处理时间或摄取时间定义窗口。当采用事件时间定义窗口,应用程序可以处理乱序事件流以及变化的事件时间偏差,并根据事件实际发生的时间计算出有意义的结果。
时间窗口
时间窗口是最简单和最有用的一种窗口。它支持滚动和滑动。滚动是收集制定时间内的数值并在收集结束后输出总和,窗口之间没有重叠。而滑动是计算指定最近一段时间(一分钟)内的数值总和,但每隔半分钟滑动一次并输出结果,窗口之间有重叠
计数窗口
计数窗口分组依据不再是时间戳,而是元素的数量。每隔指定的元素滑动一次。虽然计算窗口游泳,但是其定义不如时间窗口严谨,因此要谨慎使用。时间不会停止,而时间窗口总会关闭。但就计数窗口而言,窗口永远不会关闭,被该窗口占用的内存也就浪费了。一种解决办法就是用时间窗口来出发超时。
会话窗口
会话是指活动阶段,其前后都是非活动阶段。会话需要有自己的处理机制,因为它们通常没有固定的持续时间,或者没有固定的交互次数。Flink是目前唯一支持会话窗口的开源流处理器。在Flink中,会话窗口由超时时间设定,即希望等待多久才认为会话已经结束。
网友评论