关于状态大小的考量
窗口可以被定义在很长的时间段上(比如几天、几周或几个月)并且积累下很大的状态,当估算窗口计算的储存需求时,注意如下:
- Flink 会为一个元素在它所属的每一个窗口中都创建一个副本。 因此,一个元素在滚动窗口的设置中只会存在一个副本(一个元素仅属于一个窗口,除非它迟到了)。 与之相反,一个元素可能会被拷贝到多个滑动窗口中,因此设置一个大小为一天、滑动距离为一秒的滑动窗口可能不是个好想法。
ReduceFunction
和AggregateFunction
可以极大地减少储存需求,因为他们会就地聚合到达的元素, 且每个窗口仅储存一个值,而使用ProcessWindowFunction
需要累积窗口中所有的元素。- 使用
Evictor
可以避免预聚合, 因为窗口中的所有数据必须先经过 evictor 才能进行计算。