Flink中的时间语义和watermark | 青训营笔记

154 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第15天

今天这一篇应该是我青训营期间最后一篇文章了吧,哎,先写吧,后面再聊天,我好困

Flink 中的时间语义

为什么需要定义时间(Time)语义

窗口操作,如果是时间窗口,分步处理流数据的时候,可能会出现乱序。我们当前处理这个数据时,其实并不是数据发生的时间,因为数据产生后,因为中间存在采集ETL,网络传输,本身就具有一个延迟,另外分布式传递时,还会引起一个延迟带来的乱序(可能本身数据都有一定延迟,但是由于分布式处理, 向后面传递时,存在后面数据超过前面),因此想要解决这种问题,需要定义一个时间语义

Flink当中三种不同的时间语义

Flink当中包含这三种时间语义,分别是Event Time、Ingestion Time、Processing Time;这三种时间语义分别代表什么呢?

Event Time

Event Time:事件创建的时间
当前的事件或是数据产生时,本来就存在一个时间,这个就叫做Event Time

Ingestion Time

Ingestion Time:数据进入Flink的时间
在数据或是事件产生之后,经过数据的采集,一般我们将它装到消息队列kafka里,有了数据源,我们分区读kafka,然后读到Flink系统里面,那这个读到的时间,和之前的时间,是不是不一样了,顺序可能也会不一样。这个时间就叫做Ingestion Time,也可以叫做摄入时间,所以这就是进入Flink的时间,那进入Flink的时间,其实也不一定是我们后面处理的时间,因为Flink是一个集群,而且这是一个分布式,一步一步前后做不同任务的集群,所以在进入的时候,我们进入source任务,在后面传递,又有不同的分区,所以顺序与时间,都会发生变化,所以这边我们需要再定义一个时间语义:Processing Time

Processing Time

Processing Time:执行操作算子的本地系统时间,与机器相关
我们上面提到的最后运行的系统时间,就是Processing Time(处理时间)

迟到数据在什么情况下会出现呢

指某个水位线之后到来的数据,它的时间戳其实是在水位线之前的 我们如果只考虑一个时间语义,没有可能会出现数据迟到的现象