Flink WaterMark的原理和特点

watermark: 中文翻译为水位线

可以理解为, 当达到这个水位线就要关闭窗口了, 关闭什么窗口呢?

这里要引出与watermark搭配使用的 EventTime Window了, 这个事件时间窗口

比如现在有一个Flink Stream 流

        如图, 我们正常不使用water mark时, 使用event time控制的话, 如果窗口为5秒(左闭右开小于五秒的数据放入一个桶), 那么数据按照顺序正常来还好, 如果数据是乱序, 就像图中, 1秒的数据 4秒的数据, 后面就是5秒的数据, 这样就到达关闭窗口的时机, 显然是不对的, 还有2秒的和3秒的数据没统计

        所以, 需要引入water mark进行控制, 引入water mark那么就需要指定允许的延迟事件, 上图允许的延迟时间是2秒, 这样每次过一个数据就计算一下 水位线涨到哪了, 但是发现一个问题, 当处理了5秒的数据后水位线涨到了3, 这样后面来的2秒的数据也是晚到数据, 如果事件窗口为3秒, 那么也2秒的数据和3秒的数据也凉凉了

        所以, 设置合适的延迟时间很重要

如上图, 设置的延迟时间为3秒, 5秒的窗口装到一个桶里面了, 后续直到8秒的数据水位线才到5,这个时候第一个窗口[0,5)触发计算输出结果,并关闭窗口, 在这个过程中, 5,6,8 这个三个时间的数据也在放入另外一个桶中, 如何设置比较好的延迟时间, 这里选择的是前五秒的秒数, 先来的减后面的最大正数差值, 比如 5-2=3最大  那么设置3秒

放入的数据就像下面这样

另外如果在触发了water mark 仍然不想5秒关闭窗口, 那么后面还可以通过如下代码设置允许最长延迟时间, 例如延迟一分钟

SingleOutputStreamOperator<SensorReading> minTempStream = dataStream.keyBy("id")
                .timeWindow(Time.seconds(15))
                .allowedLateness(Time.minutes(1))
                .sideOutputLateData(outputTag)
                .minBy("temperature");

这样最终的结果是要到event time为 68秒的那个数据到来,才会关闭第一个窗口,  68-3=65 65-60=5

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值