彻底搞清Flink中的Window (4)

默认情况下,当水印超过窗口末尾时,会删除延迟数据元。
但是,Flink允许为窗口 算子指定最大允许延迟。允许延迟指定数据元在被删除之前可以延迟多少时间,并且其默认值为0.
在水印通过窗口结束之后但在通过窗口结束加上允许的延迟之前到达的数据元,仍然添加到窗口中。
根据使用的触发器,延迟但未丢弃的数据元可能会导致窗口再次触发。就是这种情况EventTimeTrigger。

当指定允许的延迟大于0时,在水印通过窗口结束后保持窗口及其内容。在这些情况下,当迟到但未掉落的数据元到达时,它可能触发窗口的另一次触发。
这些射击被称为late firings,因为它们是由迟到事件触发的,与之相反的main firing 是窗口的第一次射击。在会话窗口的情况下,后期点火可以进一步导致窗口的合并,因为它们可以“桥接”两个预先存在的未合并窗口之间的间隙。
后期触发发出的数据元应该被视为先前计算的更新结果,即,您的数据流将包含同一计算的多个结果。根据您的应用程序,您需要考虑这些重复的结果或对其进行重复数据删除。

窗口的使用

Flink为每个窗口创建一个每个数据元的副本。鉴于此,翻滚窗口保存每个数据元的一个副本(一个数据元恰好属于一个窗口,除非它被延迟)
动窗口会每个数据元创建几个复本,如“ 窗口分配器”部分中所述。因此,尺寸为1天且滑动1秒的滑动窗口可能不是一个好主意。

ReduceFunction,AggregateFunction并且FoldFunction可以显着降低存储要求,因为它们急切地聚合数据元并且每个窗口只存储一个值。
相反,仅使用 ProcessWindowFunction需要累积所有数据元。

Evictor

它剔除元素的时机是:在触发器触发之后,在窗口被处理(apply windowFunction)之前

Flink 的窗口模型允许在窗口分配器和触发器之外指定一个可选的驱逐器(Evictor)。可以使用 evictor(...) 方法来完成。
驱逐器能够在触发器触发之后,以及在应用窗口函数之前或之后从窗口中移除元素

默认情况下,所有内置的驱逐器在窗口函数之前使用

指定驱逐器可以避免预聚合(pre-aggregation),因为窗口内所有元素必须在应用计算之前传递给驱逐器。

Flink不保证窗口内元素的顺序。这意味着虽然驱逐者可以从窗口的开头移除元素,但这些元素不一定是先到的还是后到的。

内置的Evitor

TimeEvitor

以毫秒为单位的时间间隔作为参数,对于给定的窗口,找到元素中的最大的时间戳max_ts,并删除时间戳小于max_ts - interval的所有元素。

本质上是将罪行的元素选出来

CountEvitor

保持窗口内元素数量符合用户指定数量,如果多于用户指定的数量,从窗口缓冲区的开头丢弃剩余的元素。

DeltaEvitor

使用 DeltaFunction和 一个阈值,计算窗口缓冲区中的最后一个元素与其余每个元素之间的 delta 值,并删除 delta 值大于或等于阈值的元素。

通过定义的DeltaFunction 和 Threshold ,计算窗口中元素和最新元素的 Delta 值,将Delta 值超过 Threshold的元素删除

watermark

watermark是一种衡量Event Time进展的机制,它是数据本身的一个隐藏属性。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzpd.html