Flink中,升序流水印的案例实现(附详细代码)
Watermark的使用情况
本来有序的Stream中的 Watermark
如果数据元素的事件时间是有序的,Watermark 时间戳会随着数据元素的事件时间按顺序生成,此时水位线的变化和事件时间保持一致(因为既然是有序的时间,就不需要设置延迟了,那么t就是 0。所以 watermark=maxtime-0 = maxtime),也就是理想状态下的水位线。当 Watermark 时间大于 Windows 结束时间就会触发对 Windows 的数据计算,以此类推, 下一个 Window 也是一样。这种情况其实是乱序数据的一种特殊情况。
乱序事件中的Watermark
现实情况下数据元素往往并不是按照其产生顺序接入到 Flink 系统中进行处理,而频繁出现乱序或迟到的情况,这种情况就需要使用 Watermarks 来应对。
有序流中的水印(升序)
升序流水印概念
事件是有序的(按照他们自己的时间戳来看),watermark是流中简单的周期性的标记。
升序的底层实现
底层调用的也是 乱序的 watermark生成器,只是 乱序程度 传了一个 0ms
watermark = maxTimestamp - outOfOrdernessMillis - 1
= maxTimestamp - 0ms -1 ms
=> 事件时间 - 1ms
需求
从socket获取数据,来计算传感器水位信息
开发步骤
1.定义类 WaterSensor String id; Long ts; Integer vc;
2.创建流执行环境
3.获取socket文本数据
4.将字符串数据切分成 WaterSensor 对象数据
5.分配水印机制,单调递增
6.分配后的数据根据id进行分组
7.设置滚动事件时间窗口,时间为10秒
8.对开窗数据进行process
9.打印输出
10.执行流环境
参考代码
