Flink Window的allowedLateness

  基于Event-Time的窗口处理流式数据,虽然提供了WaterMark机制,却只能在一定程度上解决了数据乱序的问题。但在某些情况下数据可能延时会分厂严重,及时通过WaterMark机制也无法等到数据全部进入窗口再进行处理。Flink中默认会将这些迟到的数据做丢弃处理,但是有些时候用户希望及时数据延迟到达的情况下,也能够正常按照流程处理并输出结果,此时就需要使用Allowed Lateness机制来对迟到的数据进行额外的处理。

  通常情况下用户虽然希望对迟到的数据进行窗口计算,但并不想将结果混入正常的计算流程中,例如用户大屏数据展示系统,及时正常的窗口中没有将迟到的数据进行统计,但为了保证页面数据显示的连续性,后来接入到系统中迟到数据所统计出来的结果不希望显示在屏幕上,而是将延时数据和结果存储到数据库中,便于后期对延时数据进行分析。对于这种情况需要借助Side Output来处理,通过使用sideOutputLateData(OutputTag)来标记迟到数据计算的结果,然后使用getSideOutput(lateOutputTag)从窗口结果中获取lateOutputTag标签对应的数据,之后转成独立的DataStream数据集进行处理,创建late-data的OutputTag。再通过该标签从窗口结果中将迟到数据筛选出来。

  注意:如果有WaterMark同时也有Allowed Lateness。那么窗口函数再次出发的条件是:waterMark < end-of-window + allowedLateness

原文地址:https://www.cnblogs.com/zbw1112/p/14060268.html