具体内容请看b站尚硅谷课程! 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili
窗口
Flink的窗口并不是静态准备好的,而是动态创建的。数据流到达时不会准备24个或者其他完整数量的桶,而是当下桶接满了,才临时又拿新桶。本质原因就是Flink是事件驱动型的计算引擎,数据流是未知而隐秘的。
滚动和滑动都是可以基于时间和数量的,但是会话窗口只能是基于时间。会话这个概念没有基于数量的。
注意这一点很重要:一般的业务日志数据都含有时间戳!
水位线WaterMark
可以根据数据的事件时间设立一个逻辑时钟,不管什么时候处理,即使现在8:10分,处理事件的事件时间为8:05,那么逻辑时钟也是8:05,只随着新到数据的时间戳推动。可以想象,WaterMark水位线就是一种允许延迟的逻辑时钟。
直到时间戳为12的数据来了,此时WaterMark=12-2=10,超过了窗口(桶)的时间容积,所以换新桶。并且之前时间戳大于10的数据都会放在新桶中。(WaterMark只是决定当前窗口是否关闭)
- 在实时流处理中,是有可能存在多个窗口同时“开启”(即接收数据)的情况。例如,当处理一个滑动窗口或者数据到达有延迟时,不同事件时间的数据可能会被分配到不同的窗口中,这些窗口可能部分重叠或完全独立。
窗口的存储和计算
延迟数据的处理
状态清理
关于窗口状态的清理,Flink 提供了几种不同的策略。默认情况下,当窗口触发计算后,如果没有设置允许的延迟时间,窗口状态会被立即清理。如果设置了允许的延迟时间,窗口状态会在延迟时间过后才被清理。