Flink时间语义与时间戳watermark

时间语义

  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处理迟到数据的机制可以解决这个问题。

posted on 2022-11-27 17:51  张少凯  阅读(188)  评论(0编辑  收藏  举报

导航