[Flink]Flink1.3 Stream指南五 窗口触发器与驱逐器

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 1. 窗口触发器触发器(Trigger)确定窗口(由窗口分配器形成)何时准备好被窗口函数处理。每个窗口分配器都带有默认触发器。

1. 窗口触发器

触发器(Trigger)确定窗口(由窗口分配器形成)何时准备好被窗口函数处理。每个窗口分配器都带有默认触发器。如果默认触发器不满足你的要求,可以使用trigger(...)指定自定义触发器。

触发器接口有五种方法允许触发器对不同的事件做出反应:

public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception;

public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception;

public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception;

public void onMerge(W window, OnMergeContext ctx) throws Exception {
    throw new UnsupportedOperationException("This trigger does not support merging.");
}

public abstract void clear(W window, TriggerContext ctx) throws Exception;

(1) onElement()方法,当每个元素被添加窗口时调用。

(2) onEventTime()方法,当注册的事件时间计时器(event-time timer)触发时调用。

(3) onProcessingTime()方法,当注册的处理时间计时器(processing-time timer)触发时调用。

(4) onMerge()方法,与状态触发器相关,并且在相应的窗口合并时合并两个触发器的状态。例如,使用会话窗口时。

(5) clear()方法,执行删除相应窗口所需的任何操作(performs any action needed upon removal of the corresponding window)。

以上方法有两件事要注意:

(1) 前三个函数决定了如何通过返回一个TriggerResult来对其调用事件采取行动。TriggerResult可以是以下之一:

public enum TriggerResult {
  // 什么都不做
    CONTINUE(false, false),

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

  // 触发计算
    FIRE(true, false),

  // 清除窗口中的元素
    PURGE(false, true);
}

(2) 上面任何方法都可以用于注册处理时间计时器或事件时间计时器以供将来的操作使用。

1.1 触发与清除

一旦触发器确定窗口准备好处理数据,它将触发,例如,它返回FIREFIRE_AND_PURGE。这是窗口算子给当前窗口发送结果的信号。给定一个带有WindowFunction的窗口,所有的元素都被传递给WindowFunction(可能在将所有元素传递给evictor之后)。带有ReduceFunction或者FoldFunction的窗口只是简单地发出他们急切希望得到的聚合结果(Windows with ReduceFunction of FoldFunction simply emit their eagerly aggregated result.)。

触发器触发时,可以是FIREFIRE_AND_PURGE。当是FIRE时保留窗口的内容,当时FIRE_AND_PURGE时会删除其内容。默认情况下,内置的触发器只返回FIRE,不会清除窗口状态(the pre-implemented triggers simply FIRE without purging the window state)。

备注:

清除只是简单地删除窗口的内容,并留下关于窗口和任何触发状态的任何潜在元信息。

1.2 窗口分配器的默认触发器

窗口分配器的默认触发器适用于许多情况。例如,所有的事件时间窗口分配器都有一个EventTimeTrigger作为默认触发器。一旦watermark到达窗口的末尾,这个触发器就会被触发。

备注:

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

备注:

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

1.3 内置触发器和自定义触发器

Flink带有一些内置触发器:

(1) EventTimeTrigger,根据watermarks测量的事件时间进度触发。

(2) ProcessingTimeTrigger,基于处理时间触发。

(3) CountTrigger,一旦窗口中的元素数量超过给定限制就会触发。

(4) PurgingTrigger将其作为另一个触发器的参数,并将其转换为带有清除功能(transforms it into a purging one)。

如果需要实现一个自定义的触发器,你应该看看Trigger抽象类。请注意,API仍在发展中,在Flink未来版本中可能会发生改变。

2. 窗口驱逐器

Flink的窗口模型允许在窗口分配器和触发器之外指定一个可选的驱逐器(Evictor)。这可以使用evictor(...)方法来完成。驱逐器能够在触发器触发之后,在应用窗口函数之前或之后从窗口中移除元素,也可以之前之后都删除元素( The evictor has the ability to remove elements from a window after the trigger fires and before and/or after the window function is applied.)。为此,Evictor接口有两种方法:

/**
 * Optionally evicts elements. Called before windowing function.
 *
 * @param elements The elements currently in the pane.
 * @param size The current number of elements in the pane.
 * @param window The {@link Window}
 * @param evictorContext The context for the Evictor
 */
void evictBefore(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);

/**
 * Optionally evicts elements. Called after windowing function.
 *
 * @param elements The elements currently in the pane.
 * @param size The current number of elements in the pane.
 * @param window The {@link Window}
 * @param evictorContext The context for the Evictor
 */
 void evictAfter(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);

evictBefore()包含驱逐逻辑,在窗口函数之前应用。而evictAfter()在窗口函数之后应用。在应用窗口函数之前被逐出的元素将不被处理。

Flink带有三个内置的驱逐器:

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

(2) DeltaEvictor:使用DeltaFunction和阈值,计算窗口缓冲区中的最后一个元素与其余每个元素之间的delta值,并删除delta值大于或等于阈值的元素(computes the delta between the last element in the window buffer and each of the remaining ones, and removes the ones with a delta greater or equal to the threshold)。

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

备注:

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

备注:

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

备注:

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

备注:

Flink版本:1.3

原文: https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/windows.html#triggers

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
2月前
|
SQL 消息中间件 分布式计算
大数据-120 - Flink Window 窗口机制-滑动时间窗口、会话窗口-基于时间驱动&基于事件驱动
大数据-120 - Flink Window 窗口机制-滑动时间窗口、会话窗口-基于时间驱动&基于事件驱动
98 0
|
2月前
|
SQL 分布式计算 大数据
大数据-119 - Flink Window总览 窗口机制-滚动时间窗口-基于时间驱动&基于事件驱动
大数据-119 - Flink Window总览 窗口机制-滚动时间窗口-基于时间驱动&基于事件驱动
73 0
|
4月前
|
SQL 存储 Unix
Flink SQL 在快手实践问题之设置 Window Offset 以调整窗口划分如何解决
Flink SQL 在快手实践问题之设置 Window Offset 以调整窗口划分如何解决
66 2
|
2月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
43 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
2月前
|
Java Shell 流计算
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
25 1
Flink-02 Flink Java 3分钟上手 Stream SingleOutputStreamOpe ExecutionEnvironment DataSet FlatMapFunction
|
2月前
|
存储 Java 数据处理
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
Flink-01 介绍Flink Java 3分钟上手 HelloWorld 和 Stream ExecutionEnvironment DataSet FlatMapFunction
36 1
|
2月前
|
消息中间件 NoSQL Java
Flink-06 Flink Java 3分钟上手 滚动窗口 时间驱动 Kafka TumblingWindow TimeWindowFunction TumblingProcessing
Flink-06 Flink Java 3分钟上手 滚动窗口 时间驱动 Kafka TumblingWindow TimeWindowFunction TumblingProcessing
42 0
|
Java Scala 流计算
[Flink]Flink1.3 Stream指南四 窗口函数
1.4版本:Flink1.4 窗口函数 在定义窗口分配器之后,我们需要在每个窗口上指定我们要执行的计算。这是窗口函数的责任,一旦系统确定窗口准备好处理数据,窗口函数就处理每个窗口中的元素。
1721 0
|
3月前
|
运维 数据处理 数据安全/隐私保护
阿里云实时计算Flink版测评报告
该测评报告详细介绍了阿里云实时计算Flink版在用户行为分析与标签画像中的应用实践,展示了其毫秒级的数据处理能力和高效的开发流程。报告还全面评测了该服务在稳定性、性能、开发运维及安全性方面的卓越表现,并对比自建Flink集群的优势。最后,报告评估了其成本效益,强调了其灵活扩展性和高投资回报率,适合各类实时数据处理需求。
|
27天前
|
存储 分布式计算 流计算
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
862 17
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎

热门文章

最新文章