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; }
仅作为笔记使用,记录信息过于简洁。