大家好,我是雷恩Layne,这是《深入浅出flink》系列的第十二篇文章,希望能对您有所收获O(∩_∩)O
文章目录
一、Flink中的时间语义
流式数据处理最大的特点是数据具有时间属性特征,Flink根据时间产生的位置不同,将时间区分为三种概念:数据生成时间(Event_time)、事件接入时间(Ingestion_time)、事件处理时间(Processing_time),用户可以根据需要选择事件类型作为流式数据的时间属性。
(1)事件时间(Event time)
事件时间是事件创建的时间,这个时间通常在到达Flink之前已经嵌入到生产数据中,因此时间顺序取决于事件产生的地方,和下游的数据处理系统的事件无关。事件时间能够保证正确性,哪怕事件是无序的、延迟的甚至是从持久层的日志或者备份中恢复的,都能保证事件得到正确处理。通常,基于事件时间的Event需要等待水位线(Watermark)的到来触发窗口。
(2)处理时间(Processing time)
处理时间是在执行算子计算过程中获取到的所在主机的时间,也就是具体执行任务的主机的系统时间。基于处理时间的流计算作业在执行时,无需等待水位线的到来触发窗口,所以可以提供较低的延迟。由于处理时间并不是数据真正产生的时间,所以在有些场景下可能会出现问题。
(3)摄入时间(Ingestion time)
摄入时间是数据接入Flink系统的时间,依赖于Source Operator所在主机的系统时钟。
处理时间(Processing time)不依赖Watermark(水位线),Watermark只在基于事件时间和摄入时间这两种时间类型下起作用,更多的是用于事件时间。
二、Watermark(水位线)
2.1 Watermark的由来
我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的,虽然大部分情况下,流到oper