【Flink实战系列】Flink 晚到(迟到)的数据怎么更新之前窗口计算结果

本文探讨了Flink如何处理迟到数据,特别是如何更新已计算的窗口结果。介绍了allowed lateness的概念,以及通过示例代码展示了如何在Flink中定义窗口以允许迟到数据并更新结果。在示例中,当迟到数据到达时,窗口状态得以保留并实时处理,从而更新MySQL中的数据。
摘要由CSDN通过智能技术生成

最近有一个朋友问我,Flink使用窗口计算的时候,如果设置了允许数据晚到时间,这个时候又来了一条属于前面窗口的数据,但是前面窗口的计算结果已经写到mysql了,怎么更正之前的结果,而不是在写入一条数据呢?今天这篇文章就来介绍一下怎么使用Flink的窗口函数更新之前计算的不完全的(不准确的结果)

对于晚到的数据,一般有几种常用的处理方式:

 

1,直接丢弃掉(这个也是窗口的默认做法,也就是说一个迟到的元素不会创建一个新的窗口)

2,用测流输出的方式,拿到晚到的元素,可以进行,相关的逻辑处理,或者保存起来.

3,更新之前的窗口计算结果,也就是今天要介绍的做法.

 

由于存在晚到的元素,所以已经计算出的窗口结果是不准确和不完全的。我们可以使用迟到元素更新已经计算完的窗口结果。

如果我们要求一个operator支持重新计算和更新已经发出的结果,就需要在第一次发出结果以后也要保存之前所有的状态。但显然我们不能一直保存所有的状态,肯定会在某一个时间点将状态清空,而一旦状态被清空,结果就再也不能重新计算或者更新了。而迟到的元素只能被抛弃或者发送到侧输出流。

window operator API提供了方法来明确声明我们要等待迟到元素。当使用event-time window,我们可以指定一个时间段叫做allowed lateness。window operator如果设置了allowed lateness,这个window operator在水位线没过窗口结束时间时也将不会删除窗口和窗口中的状态。窗口会在一段时间内(allowed lateness设置的)保留所有的元素。

当迟到元素在allowed lateness时间内到达时,这个迟到元素会被实时处理并发送到触发器(trigger)。当水位线没过了窗口结束时间+allowed lateness时间时,窗口会被删除,并且所有后来的迟到的元素都会被丢弃。

 

首先来看一下具体的代码实现:</

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JasonLee实时计算

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值