时间语义
Event Time:事件创建或产生的时间。事件时间。
Ingestion Time:数据进入flink的时间。摄入时间。
Processing Time:执行操作算子的本地系统时间,与机器相关。处理时间。window processing time。
不同的时间有不同的应用场合,我们往往更关心事件时间。
在代码中设置事件时间
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
乱序数据的影响
当Flink以Event Time模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子。
由于网络、分布式等原因,会导致乱序数据的产生。
水位线watermark
怎样避免乱序数据带来的计算不正确。
遇到一个时间戳达到了窗口关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。
watermark是一种衡量Event time进展的机制,可以设定延迟触发
watermark是用于处理乱序时间的,正确的处理乱序时间,通常是用watermark机制结合window来实现。
数据流中的watermark用于表示timestamp小于watermark的数据都已经达到了,因此,window的执行也是由watermark来触发的。
watermark用来让程序自己平衡延迟和结果正确性。
watermark特点
watermark是一条带着时间戳的特殊数据。(watermark extends StreamElement)
watermark必须单调递增,以确保任务的事件时间始终在向前推进,而不是在后退。
watermark与数据的时间戳相关。
watermark传递
各个分区watermark不一致时,以最小的watermark为准,向下游广播。如果到来的watermark大于各分区的值,则不更新watermark,也不向下游广播。
watermark代码中的引入
Event time的使用一定要指定数据源中的时间戳。
调用assignTimeStampAndWatermarks方法,传入一个BoundedOutOfOrdernessTimestampExtractor,就可以指定watermark。
watermark的设定原则
在flink中,watermark由应用程序开发人员生成,这通常需要对相应的领域有所了解。
如果watermark设定的延迟太久,收到结果的速度可能就会很慢,解决办法是在水位线到达之前输出一个近似结果。
如果watermark到的太早,则可能收到错误结果,不过flink处理迟到数据的机制可以解决这个问题。