开发者社区> sjf0115> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Flink1.4 窗口触发器与Evictors

简介: 原文来源于:Flink1.4 窗口触发器与Evictors 1. 窗口触发器 触发器(Trigger)决定了窗口(请参阅窗口概述)博文)什么时候准备好被窗口函数处理。
+关注继续查看

原文来源于:Flink1.4 窗口触发器与Evictors

1. 窗口触发器

触发器(Trigger)决定了窗口(请参阅窗口概述)博文)什么时候准备好被窗口函数处理。每个窗口分配器都带有一个默认的 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;
  • onElement() 方法,当每个元素被添加窗口时调用。
  • onEventTime() 方法,当注册的事件时间计时器被触发时调用。
  • onProcessingTime() 方法,当注册的处理时间计时器被触发时调用。
  • onMerge() 方法,与状态 触发器相关,并且在相应的窗口合并时合并两个触发器的状态。例如,使用会话窗口时。
  • clear() 方法,在删除相应窗口时执行所需的任何操作。

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

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

  • CONTINUE 什么都不做
  • FIRE_AND_PURGE 触发计算,然后清除窗口中的元素
  • FIRE 触发计算
  • PURGE 清除窗口中的元素

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

1.1 触发与清除

一旦触发器确定窗口准备好可以处理数据,就将触发,即,它返回 FIRE 或 FIRE_AND_PURGE。这是窗口算子发出当前窗口结果的信号。给定一个带有 ProcessWindowFunction 的窗口,所有的元素都被传递给 ProcessWindowFunction (可能在将所有元素传递给 evictor 之后)。带有 ReduceFunction, AggregateFunction 或者 FoldFunction 的窗口只是简单地发出他们急切希望得到的聚合结果。

触发器触发时,可以是 FIRE 或 FIRE_AND_PURGE 。FIRE 保留窗口中的内容,FIRE_AND_PURGE 会删除窗口中的内容。默认情况下,内置的触发器只返回 FIRE,不会清除窗口状态。

备注
清除只是简单地删除窗口的内容,并保留窗口的元数据信息以及完整的触发状态。

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

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

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

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

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

Flink带有一些内置触发器:

  • EventTimeTrigger 根据 watermarks 度量的事件时间进度进行触发。
  • ProcessingTimeTrigger 基于处理时间触发。
  • CountTrigger 一旦窗口中的元素数量超过给定限制就会触发。
  • PurgingTrigger 将其作为另一个触发器的参数,并将其转换为带有清除功能(transforms it into a purging one)。

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

2. 窗口驱逐器

Flink 的窗口模型允许在窗口分配器和触发器之外指定一个可选的驱逐器(Evictor)。可以使用 evictor(...) 方法来完成。驱逐器能够在触发器触发之后,以及在应用窗口函数之前或之后从窗口中移除元素。为此,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带有三个内置的驱逐器:

  • CountEvictor:保持窗口内元素数量符合用户指定数量,如果多于用户指定的数量,从窗口缓冲区的开头丢弃剩余的元素。
  • DeltaEvictor:使用 DeltaFunction和 一个阈值,计算窗口缓冲区中的最后一个元素与其余每个元素之间的 delta 值,并删除 delta 值大于或等于阈值的元素。
  • TimeEvictor:以毫秒为单位的时间间隔作为参数,对于给定的窗口,找到元素中的最大的时间戳max_ts,并删除时间戳小于max_ts - interval的所有元素。

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

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

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

Flink版本:1.4

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何将实时计算 Flink 版与自身环境打通|学习笔记
快速学习 如何将实时计算 Flink 版与自身环境打通
152 0
贝壳基于 Flink 的实时计算演进之路
贝壳找房在实时计算之路上的平台建设以及实时数仓应用。
6127 0
【必看】如何正确使用实时计算 Flink 版?
本篇文章将从实时计算 Flink 版产品功能、产品架构、产品模式、产品优势、产品应用场景等全面呈现,同时还汇总了实时计算 Flink 版学习资料!更有特惠独享活动限时参与!
3140 0
免费下载!从入门到精通,实时计算 Flink 版独家实战秘籍
9天 Get 企业级大数据实战能力!阿里巴巴核心研发团队手把手教学~
25028 0
如何开通实时计算 Flink 版
本文由阿里巴巴产品专家赵开兴分享,主要介绍实时计算 Flink的开通、功能及使用,并通过多个演示示例进行详细demo演示。内容主要分享以下几部分:1、Blink独享集群使用介绍;2、Flink 全托管集群的使用
1853 0
实时计算 Flink 版应用场景与产品介绍
本文由阿里巴巴高级产品专家陈守元老师分享,详细讲解实时计算 Flink 的具体业务场景并分享实时计算 Flink 的相关应用案例。
6685 0
【行业应用】阿里云实时计算 Flink 版在运维领域解决方案
相比于传统的运维方式,大数据时代的运维面临着集群规模更大、业务组件更多、监控可视化与智能化等更为复杂的难题。
3647 0
开源 Flink + 实时计算 Flink 版训练营学习资料汇总
Apache Flink 是一个开源的分布式大数据处理引擎, 可对有限数据流和无限数据流进行有状态计算。实时计算 Flink版是阿里云提供的基于 Apache Flink 构建的企业级、高性能实时大数据处理系统,由Apache Flink创始团队官方出品。
5224 0
实时计算 Flink 版 最佳实践
实时计算 Flink 版 最佳实践目录
9901 0
实时计算Flink云原生版本正式发布
Why Flink on Kubernetes Apache Flink是Apache社区的顶级开源项目,主攻流计算领域,具备高吞吐,低延时的特点,在流计算领域已经取代了storm/spark streaming,成为了目前流式处理领域的最热门引擎。
2452 0
+关注
sjf0115
Stay Hungry, Stay Foolish---我们必须用谦虚者的自觉,饥饿者的渴望的求职态度,来拥抱我们的未来。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Apache Flink 流式应用中状态的数据结构定义升级
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载