一、时间语义
Flink在流处理中提供了不同的时间语义支持,其中有两种核心的时间语义:ProcessingTime与EventTime。
ProcessingTime表示的是处理时间,在处理时间流处理中,所有涉及的时间计算都是以本地机器的时间为准,例如每5分钟的一个时间窗口操作,0-5分钟的窗口触发需要满足本地机器到达5分钟后然后触发窗口函数操作这5分钟内的数据。由于操作的数据是这段时间到达的数据,所以其处理的数据量容易受上游处理的速度影响,处理的快汇聚的数据就多,所以其结果不具有确定性,特别是在流重放的情况下;
EventTime表示的是事件时间,也就是数据本身含有的时间属性,例如点击页面事件的点击时间,那么在事件时间的流处理中,事件时间就是表示当前的时间进度,而不是本地机器时间。在分配时间窗口的数据时会按照数据的时间属性来分配,由于数据时间属性不会改变,因此在数据重放过程中,分配在窗口的数据也不会改变,因此得到一个比较确定的结果,其目标也就是尽可能的还原数据场景。
二、EventTime与Watermark
在ProcessingTime流处理中时间窗口的触发是当本地机器时间达到窗口结束时自动触发,而在EventTime流处理中时间窗口的触发是当前Watermark大于等于窗口的结束时间时触发。
何为Watermark?Watermark也称之为水位,是用来衡量在EventTime语义的流处理中时间进度,也就是当前流处理达到的时间点,其本质上就是一个时间戳,系统会认为在水位以下(事件时间小于watermark值)的数据已经全部到达。
事件中已经包含时间属性,为什么还需要W