Flink WaterMark
Flink中的Time
- eventTime 事件时间
- IngestionTime 摄入时间
- ProcessingTime 处理时间
//设置使用事件时间,flink的时间属性
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
Watermark
水印是用来触发窗口执行,解决网络延迟的问题
公式:水印时间 = 事件时间-允许延迟时间
水印时间达到窗口结束时间才触发窗口执行
编码模板:
1、获取数据源
获取执行环境时候,要设置时间属性
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
基于eventTime的话,flink程序会在时间轴上自己划分窗口,而不是根据窗口中有没有数据
2、转化
3、声明水印(watermark)
dataStream.assignTimestampsAndWatermarks(new WatermarkStrategy<T>(){
@Override
public WatermarkGenerator<T> createWatermarkGenerator(){
@override
public void onEvent(Tuple2<String, Long> event, long eventTimestamp, WatermarkOutput output){
//每个event来了以后进行一次这个处理
}
@override
public void onPeriodicEmit(WatermarkOutput output){
//获得水印,并周期性发射水印,env的conf种可以设置时间
}
})
4、分组聚合,调用window的操作
5、保存处理结果
package com.lagou.time;
import net.minidev.json.JSONUtil;
import org.apache.flink.api.common.eventtime.*;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.datastream.WindowedStream;
import org