触发器(Trigger)

触发器(Trigger)

触发器主要是用来控制窗口什么时候触发计算。所谓的“触发计算”,本质上就是执行窗
口函数,所以可以认为是计算得到结果并输出的过程。Trigger需要配合窗口来使用,
在 Flink 中,只有“按键分区流”KeyedStream才支持设置定时器的操作

基于 WindowedStream 调用 trigger()方法,就可以传入一个自定义的窗口触发器(Trigger)。
stream.keyBy(…)
.window(…)
.trigger(new MyTrigger())
Trigger 是窗口算子的内部属性,每个窗口分配器(WindowAssigner)都会对应一个默认
的触发器;对于 Flink 内置的窗口类型,它们的触发器都已经做了实现。例如,所有事件时间
窗口,默认的触发器都是 EventTimeTrigger;类似还有 ProcessingTimeTrigger 和 CountTrigger。
所以一般情况下是不需要自定义触发器的,不过我们依然有必要了解它的原理。
Trigger 是一个抽象类,自定义时必须实现下面四个抽象方法:
⚫ onElement():窗口中每到来一个元素,都会调用这个方法。
⚫ onEventTime():当注册的事件时间定时器触发时,将调用这个方法。
⚫ onProcessingTime ():当注册的处理时间定时器触发时,将调用这个方法。
⚫ clear():当窗口关闭销毁时,调用这个方法。一般用来清除自定义的状态。
可以看到,除了 clear()比较像生命周期方法,其他三个方法其实都是对某种事件的响应。
onElement()是对流中数据元素到来的响应;而另两个则是对时间的响应。这几个方法的参数中
都有一个“触发器上下文”(TriggerContext)对象,可以用来注册定时器回调(callback)。这
里提到的“定时器”(Timer),其实就是我们设定的一个“闹钟”,代表未来某个时间点会执行
的事件;当时间进展到设定的值时,就会执行定义好的操作。很明显,对于时间窗口
(TimeWindow)而言,就应该是在窗口的结束时间设定了一个定时器,这样到时间就可以触发
窗口的计算输出了。关于定时器的内容,我们在后面讲解处理函数(process function)时还会
提到。
上面的前三个方法可以响应事件,那它们又是怎样跟窗口操作联系起来的呢?这就需要了
解一下它们的返回值。这三个方法返回类型都是 TriggerResult,这是一个枚举类型(enum),
其中定义了对窗口进行操作的四种类型。
⚫ CONTINUE(继续):什么都不做
⚫ FIRE(触发):触发计算,输出结果
⚫ PURGE(清除):清空窗口中的所有数据,销毁窗口
⚫ FIRE_AND_PURGE(触发并清除):触发计算输出结果,并清除窗口
我们可以看到,Trigger 除了可以控制触发计算,还可以定义窗口什么时候关闭(销毁)。
上面的四种类型,其实也就是这两个操作交叉配对产生的结果。一般我们会认为,到了窗口的
结束时间,那么就会触发计算输出结果,然后关闭窗口——似乎这两个操作应该是同时发生的;
但 TriggerResult 的定义告诉我们,两者可以分开。

通过 window()/windowAll()方法定义窗口分配器,得到 WindowedStream;
然 后 通 过 各 种 转 换 方 法 ( reduce()/aggregate()/apply()/process() ) 给 出 窗 口 函 数
(ReduceFunction/AggregateFunction/ProcessWindowFunction),定义窗口的具体计算处理逻辑,
转换之后重新得到 DataStream。这两者必不可少,是窗口算子(WindowOperator)最重要的组
成部分。
此外,在这两者之间,还可以基于 WindowedStream 调用.trigger()自定义触发器、调
用.evictor()定义移除器、调用 allowedLateness()指定允许延迟时间、调用 sideOutputLateData()
将迟到数据写入侧输出流,这些都是可选的 API,一般不需要实现。而如果定义了侧输出流,
可以基于窗口聚合之后的 DataStream 调用 getSideOutput()获取侧输出流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值