@malloc

导航

watermark

一、watermark

  flink每条记录都产生一个waterMark,waterMark生成之后可修改。计算公式为当前接收到的最大eventTime-延迟时间,窗口函数接收到消息满足条件会触发窗口操作,因此若无满足条件消息进入则窗口不会进行计算。

  窗口计算触发条件:1、watermark时间>=window_end_time;2、在[window_start_time,window_end_time)中有数据。

  并行计算时,会产生多个waterMark,以最小的waterMark为准,parallelism=2时,当两个waterMark都>=window_end_time时进行窗口计算。

  //指定按照eventtime时间处理
   env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
    val stream = env.fromElements((1,"A"),(2,"B"),(3,"B"),(3000,"C")).assignTimestampsAndWatermarks(
//指定延迟时间为1秒
      new BoundedOutOfOrdernessTimestampExtractor[(Int, String)](Time.seconds(1)) {
        //指定字段作为eventtime
        override def extractTimestamp(element: (Int, String)): Long = {
          element._1.toLong
        }
      }
    )
    val result = stream.keyBy(1).window(
//eventtimewindow
      TumblingEventTimeWindows.of(Time.seconds(1))
    ).sum(0)

 二、窗口时间计算

1、窗口开始时间

//timestamp 窗口启动的毫秒时间戳 offset watermark设置的延迟时间
public static long getWindowStartWithOffset(long timestamp, long offset, long windowSize) {
        return timestamp - (timestamp - offset + windowSize) % windowSize;
    }

 

posted on 2019-09-02 19:04  malloc+  阅读(317)  评论(0编辑  收藏  举报