基于EventTime的窗口处理流式数据,虽然提供了水位线Watermark机制,却只能一定程度上解决子数据乱序的间题。但在某些情况下数据可能延时会非常严重,Flink默认会将这些数据丢弃。如果要保留,需要Allowed Lateness机制来处理迟到的数据。
DataStrcam API中提供了 allowedLateness 方法,传人Time类型的时间间隔大小(t),其代表允许延时的最大时间,Flink窗口算过程中会将 Window的 Endtime加上该时间,作为窗口最后被释放的结束时间§,当接人的数据中 EventTime未超过该时间§,但 Watermak 已经超过 Window 的 EndTim时直接触发窗口计算。相反,如果事件时间超过了最大延时时间§,则只能对数据进行丢弃处理。
通常情况下用户虽然希望对迟到的数据进行窗口计算,但并不想将结果混入正常的计算流程中,例如用户大屏数据展示系统,即使正常的窗口中没有将迟到的数据进行统计,但为了保证页面数据显示的连续性,后来接人到系统中迟到数据所统计出来的结果不希望显示在屏幕上,而是将延时数据和结果存储到数据库中,便于后期对延时据进行分析。对于这种情况需要借助 SideOutput来处理,然后使用getsideOutput(lateOutputTag)获取标签对应的数据,之后转成独立的datastream数据集处理迟到数据