前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flink1.4 窗口触发器与Evictors

Flink1.4 窗口触发器与Evictors

作者头像
smartsi
发布2019-08-07 14:17:47
1.4K0
发布2019-08-07 14:17:47
举报
文章被收录于专栏:SmartSiSmartSi

1. 窗口触发器

触发器(Trigger)决定了窗口(请参阅窗口概述)博文)什么时候使用窗口函数处理窗口内元素。每个窗口分配器都带有一个默认的触发器。如果默认触发器不能满足你的要求,可以使用 trigger(...) 指定自定义的触发器。

触发器接口有五个方法来对不同的事件做出响应:

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

代码语言:javascript
复制
public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception;

(2) 当注册的处理时间计时器被触发时调用onProcessingTime()方法:

代码语言:javascript
复制
public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception;

(3) 当注册的事件时间计时器被触发时调用onEventTime()方法:

代码语言:javascript
复制
public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx)

(4) 在窗口合并时onMerge()方法与状态触发器相关,并且合并两个触发器的状态:

代码语言:javascript
复制
public void onMerge(W window, OnMergeContext ctx)

(5) 在清除(removal)窗口时调用clear() 方法:

代码语言:javascript
复制
public abstract void clear(W window, TriggerContext ctx)

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

(1) 前三个函数决定了如何通过返回一个 TriggerResult 对象来对其调用事件进行操作。TriggerResult可以是,CONTINUE(什么都不做),FIRE_AND_PURGE(触发计算,然后清除窗口中的元素),FIRE(触发计算),PURGE(清除窗口中的元素)。

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

1.1 触发与清除

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

触发器触发时,可以是 FIREFIRE_AND_PURGEFIRE 保留窗口中的内容,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 接口有两种方法:

代码语言:javascript
复制
void evictBefore(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);

void evictAfter(Iterable<TimestampedValue<T>> elements, int size, W window, EvictorContext evictorContext);

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

Flink带有三种内置驱逐器:

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

默认情况下,所有内置的驱逐器在窗口函数之前使用。指定驱逐器可以避免预聚合(pre-aggregation),因为窗口内所有元素必须在窗口计算之前传递给驱逐器。Flink 不保证窗口内元素的顺序。这意味着虽然驱逐器可以从窗口开头移除元素,但这些元素不一定是先到的还是后到的。

Flink版本:1.4

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 窗口触发器
    • 1.1 触发与清除
      • 1.2 窗口分配器的默认触发器
        • 1.3 内置触发器和自定义触发器
        • 2. 窗口驱逐器
        相关产品与服务
        大数据
        全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档