摘要: 理解流处理中的时间语义,处理时间和事件时间。
如图,在无界数据中,随着时间推移,数据一直产生,但真实情况中,往往在一段时间内的数据都是不均匀的,往往会出现意外的情况,比如在地铁无信号的情况下,数据虽然产生,但是会有一段时间延迟才会到达消息队列,例如虚线框中的数据。
处理时间
处理时间就是流计算处理程序的机器本地时间,按照这种时间语义,在流计算的时间窗口中,上述例子中的数据会按这样分布:
基于本地时间,在第一分钟,流处理程序只收到了 15
、18
两个数据,后续数据由于网络原因,在 8:01:00 之后才到达流计算程序,所以后续数据在下一个时间窗口内。
事件时间
事件时间就是事件的发生时间,这个时间通常会在数据中,按照这种时间语义,在流计算的时间窗口中,上述例子中的数据会按这样分布:
基于事件时间,在第一分钟,数据应该是:15
18
9
10
,在第二分钟,数据应该是:11
。
watermark
由于事件时间的窗口和事件相关,那么如果下一个事件还未到达,流计算程序是否就无限等待呢?
为了解决这个问题,flink 引入 watermark 的概念,假如定义 watermark 为 T,那么在每一个时间窗口中,T 都会单调递增 T < T1
,并且下一个时间窗口中的事件时间必须大于 T1
,那么每一个时间窗口的数据就是介于 T-T1
。