解决场景:使用阿里云flink 托管平台 flink sql,数据流不是连续的,计算某个时间段内数据,计算周期可能跨时间段,窗口默认左闭右开,数据流的末尾窗口,需要左闭右闭,在datastream api中可通过自定义窗口和自定义watermark来解决这个问题,为解决flink sql中业务规则产生的问题,可通过自定义connector中在原生窗口下的水位线推进。
实现原理参考这个:自定义生成水印:www.modb.pro/db/44375 自定义connenctor:https://www.jianshu.com/p/9dfd932af0af
实现方法:
定义两个类继承分别继承WaterMarkStategy WatermarkGenerator类,重写方法
同时将自定义继承DynamicTableSource(创建动态源表)的子类中的applyWatermark()方法进行重写。
生成水印:
WatermarkGenerator中的两个方法:
onEvent:每条记录进来都会调用一次这个方法,入参有3个,第一个是记录,第二个是记录携带的时间,如果注册了时间就会有,第三个参数时水印发射器WatermarkOutputoutput,可以通过这个参数对水印进行发射,用户可以根据自己的业务场景来编写自己的水印生成以及发射逻辑。该方法的重点是每条记录都会调用.
onPeriodicEmit: 该方法是Flink提供的一个定时器方法,每隔一段时间会调用此方法,入参是WatermarkOutputoutput,用户可以通过这个方法每隔一段时间发送一次水印,当记录数过多时,每条记录都发送一次水印明显不合适,也影响性能,此时可以通过这个方法进行水印的定时发送,而onEvent只记录当前水印而选择不发射出去。该方法的参数配置为env.getConfig().setAutoWatermarkInterval(300L),入参是毫秒数,表示隔多少毫秒向下游算子发送一次水印。
生成水印先记这么多,之后对flink深入了解后,再研究。



