目录
1. Wartermark是什么
2. 两个常见的问题
3. 参考资料
1. Wartermark是什么
Watermark 是 Apache Flink 提出的一种用来解决乱序、延迟数据等情况的解决
方案,通常和窗口结合使用。本质上来说 Watermark 就是 单调递增的时间戳,来控制等待延迟数据的最大时长。
由周期性生成和标记生成两种方法。
单流wartermark
多流wartermark:多流会出现空闲流的问题。空闲流的问题,用户可以设置一个超时时间,当某个流超过指定时间,没有新数据的话,flink就会放弃原来的全局wm,重新生成一个新的wm。
2. 两个常见的问题
下面的两个问题值得思考:
1.对于超出延迟范围的内的数据如何处理?(默认情况下是直接丢弃掉)
参考这里【Flink】Flink对于迟到数据的处理_hlp4207的博客-CSDN博客_flink 延迟数据处理
flink延迟数据处理_hyy_blog-CSDN博客_flink延迟数据处理
通过AllowedLateness&OutputTag来获得严重延迟的数据。
AllowedLateness&OutputTag
DataStream API提供了allowedLateness方法来指定是否对迟到数据进行处理,指定后,Flink窗口计算过程中会将window的Endtime加上该时间作为窗口最后被释放的时间,当接入的数据中EventTime未超过窗口最后被释放的时间,但WaterMark已经超过Window的EndTime时,直接触发窗口计算。相反,如果事件时间超过了窗口最后被释放的时间(最大延时时间),则只能对数据进行丢弃处理。
默认情况下,GlobleWindow的最大Lateness时间为Long.MAX_VALUE,即不超时,因此数据会源源不断累积到窗口中,等待被触发。
设置延迟时间和获取延迟数据的步骤
(1)定义保存lateDate数据的对象
val lateData = new OutputTag[(String,Long)]("late")
(2)在datastream中设置允许延迟的时间:allowedLateness(Time.seconds(2L))
(3)通过sideOutputLateData(lateData)来将延迟的数据保存到dateDate对象中
val result: DataStream[String] = waterStream.keyBy(0)// 根据name值进行分组
.window(TumblingEventTimeWindows.of(Time.seconds(5L)))// 5s跨度的基于事件时间的翻滚窗口
.allowedLateness(Time.seconds(2L))
.sideOutputLateData(lateData)
(4)获取datastream中延迟对象中的数据,并打印
val late = result.getSideOutput(lateData)
late.print("迟到的数据:")
2.Watermark 容错处理(实际场景中消费 kafka 的案例比较多,那么当程序挂掉
重启之后 watermark 会恢复吗?如果不能恢复应该如何解决?)
参考这里 [Flink-5601] Window operator does not checkpoint watermarks - ASF JIRA
3. 参考资料
【Flink】Flink对于迟到数据的处理_hlp4207的博客-CSDN博客_flink 延迟数据处理
flink延迟数据处理_hyy_blog-CSDN博客_flink延迟数据处理
Flink笔记-延迟数据处理_yangxiaobo118的博客-CSDN博客_flink延迟数据处理



