彻底搞清Flink中的Window (2)

image-20210202200710573

前两条数据先后于20:01和20:02进入窗口,此时 State 中的值更新为3,同时到了Trigger的触发时间,输出结果为3。

image-20210202200733128

由于 PurgingTrigger 的作用,State 中的数据会被清除。

image-20210202200744793

DeltaTrigger DeltaTrigger 的应用

有这样一个车辆区间测试的需求,车辆每分钟上报当前位置与车速,每行进10公里,计算区间内最高车速。

image-20210202200802480

触发器原型

onElement

onProcessingTime

onEventTime

onMerge

clear

说明

TriggerResult可以是以下之一

CONTINUE 什么都不做

FIRE_AND_PURGE 触发计算,然后清除窗口中的元素

FIRE 触发计算 默认情况下,内置的触发器只返回 FIRE,不会清除窗口状态。

PURGE 清除窗口中的元素

所有的事件时间窗口分配器都有一个 EventTimeTrigger 作为默认触发器。一旦 watermark 到达窗口末尾,这个触发器就会被触发。

全局窗口(GlobalWindow)的默认触发器是永不会被触发的 NeverTrigger。因此,在使用全局窗口时,必须自定义一个触发器。

通过使用 trigger() 方法指定触发器,将会覆盖窗口分配器的默认触发器。例如,如果你为 TumblingEventTimeWindows 指定 CountTrigger,
那么不会再根据时间进度触发窗口,而只能通过计数。目前为止,如果你希望基于时间以及计数进行触发,则必须编写自己的自定义触发器。

窗口的分类

根据窗口是否调用keyBy算子key化,分为被Keys化Windows和非被Keys化Windows;

flink window图解

根据窗口的驱动方式,分为时间驱动(Time Window)、数据驱动(Count Window);

根据窗口的元素分配方式,分为滚动窗口(tumbling windows)、滑动窗口(sliding windows)、会话窗口(session windows)以及全局窗口(global windows)

被Keys化Windows

可以理解为按照原始数据流中的某个key进行分类,拥有同一个key值的数据流将为进入同一个window,多个窗口并行的逻辑流

stream .keyBy(...) <- keyed versus non-keyed windows .window(...) <- required: "assigner" [.trigger(...)] <- optional: "trigger" (else default trigger) [.evictor(...)] <- optional: "evictor" (else no evictor) [.allowedLateness(...)] <- optional: "lateness" (else zero) [.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data) .reduce/aggregate/fold/apply() <- required: "function" [.getSideOutput(...)] <- optional: "output tag" 非被Keys化Windows

不做分类,每进入一条数据即增加一个窗口,多个窗口并行,每个窗口处理1条数据

WindowAll 将元素按照某种特性聚集在一起,该函数不支持并行操作,默认的并行度就是1,所以如果使用这个算子的话需要注意一下性能问题

stream .windowAll(...) <- required: "assigner" [.trigger(...)] <- optional: "trigger" (else default trigger) [.evictor(...)] <- optional: "evictor" (else no evictor) [.allowedLateness(...)] <- optional: "lateness" (else zero) [.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data) .reduce/aggregate/fold/apply() <- required: "function" [.getSideOutput(...)] <- optional: "output tag"

区别

对于被Key化的数据流,可以将传入事件的任何属性用作键(此处有更多详细信息)。

拥有被Key化的数据流将允许您的窗口计算由多个任务并行执行,因为每个逻辑被Key化的数据流可以独立于其余任务进行处理。
引用相同Keys的所有数据元将被发送到同一个并行任务。

Time-Based window(基于时间的窗口)

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

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