0


1分钟理解Flink中Watermark机制

本文隶属于专栏《董工的1000个大数据技术体系》摘要,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!


前言

Flink中流处理由事件产生,经过source,再到operator,中间是有一个过程和时间的,虽然都是按事件产生的时间顺序产生的,但是我们也不能排除,网络,背压等问题会导致乱序的产生,如果发生这种情况,我们又不能一直等下去,所以必须要有个机制来保证在一个特定的时间后,必须触发窗口去进行计算了。这个特别的机制,就是水位线(waterark)。

一、watermark是什么?

在Flink中,水位线是一种衡量Event Time进展的机制,用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。简单来说 Watermark就是用来触发window计算的

在Flink处理窗口数据的过程中,如果确定数据已经全部到达之后,就可以计算,分组,聚合等操作,如果数据没有全部达到那就继续等待窗口数据全部到达之后才能处理,这就需要我们的watermark机制来进行处理,watermark可以保证数据的完整性,保证数据全部到达 Flink 之后,或者在乱序以及延迟数据到达的时候,也能够像预期一样计算出正确并且连续的结果

二、乱序数据处理

  • 当flink用Event Time处理数据的时候,(如上图所示,例如,在理想状态下,有一个5s数据的窗口,当时间[0,5)窗口就可以看是计算了)
  • 但是在实际情况下,不排除一些网络等特殊原因导致数据乱序
  • 乱序会导致窗口计算啊数据不准确( 在所写的第一点上,获取5s钟的数据,但是如上图所示,2s和3s数据还没有进入窗口中,理论上窗口不应该关闭 )

三、迟到事件

    虽然说水位线表明着早于它的事件不应该再出现,但是接收到水位线以前的的消息是不可避免的,这就是所谓的迟到事件。实际上迟到事件是乱序事件的特例,和一般乱序事件不同的是它们的乱序程度超出了水位线的预计,导致窗口在它们到达之前已经关闭。

    迟到时间有3中处理的方式
  • allowedLateness : 在已关闭的窗口当中,让窗口在延迟一段时间,让数据到达
  • sideOutputLateData : 把迟到的数据放在一个标签当中,当一个测输出流,之后在进行后续的处理
  • 直接丢弃 : 把迟到数据当一个错误的数据直接丢弃

四、watermark的引入

watermark的引入很简单,对于乱序数据,最常见的引用方式如下:

map.assignTimestampsAndWatermarks(WatermarkStrategy.
        <JSONObject>forBoundedOutOfOrderness(Duration.ofSeconds(2))
        .withTimestampAssigner(new SerializableTimestampAssigner<JSONObject>() {
    @Override
    public long extractTimestamp(JSONObject jsonObject, long l) {
        return jsonObject.getLong("ts");
    }
}));

不管有序无序,都可以使用上述代码,有序的数据知识无序数据的特殊情况.


本文转载自: https://blog.csdn.net/m0_68470434/article/details/126742410
版权归原作者 HaoRan. 所有, 如有侵权,请联系我们删除。

“1分钟理解Flink中Watermark机制”的评论:

还没有评论