Flink之Trigger

  Flink是真正的实时处理,数据流入flink的source之后,假如需要窗口函数,我们就要使用一定的规则来判断或者叫决定该数据应该属于哪个窗口,然后是窗口要是基于事件时间的话我们还要提供时间戳抽取器和watermark分配器,最后还要指定满足何种条件触发窗口计算并输出结果。

  那可能会说了触发窗口计算,不就是时间到窗口结束时间了直接输出不就行了吗?这样输出的频率可以直接由滑动间隔来控制了。

  实际上,不行的,基于事件时间处理机制,数据会在有些意想不到的情况下滞后,比如forward故障等,这种情况,对于Flink来说我们可以设置一些参数来允许处理滞后的元素,比如允许其滞后一小时,那么这个时候实际上窗口输出间隔就是要加上这个滞后时间了,这时候假如我们想要尽可能的实时输出的话,就要用到Flink的Trigger机制。

Trigger定义了何时开始使用窗口计算函数计算窗口。每个窗口分配器都会有一个默认的Trigger。如果,默认的Trigger不能满足你的需求,你可以指定一个自定义的trigger().

Trigger接口有五个方法允许Trigger对不同的事件做出反应:

  • onElement():进入窗口的每个元素都会调用该方法。

  • onEventTime():事件时间timer触发的时候被调用。

  • onProcessingTime():处理时间timer触发的时候会被调用。

  • onMerge():有状态的触发器相关,并在它们相应的窗口合并时合并两个触发器的状态,例如使用会话窗口。

  • clear():该方法主要是执行窗口的删除操作。

关于上述方法需要注意两点:

1).前三方法决定着如何通过返回一个TriggerResult来操作输入事件。

  • CONTINUE:什么都不做。

  • FIRE:触发计算。

  • PURE:清除窗口的元素。

  • FIRE_AND_PURE:触发计算和清除窗口元素。

2).这些方法中的任何一个都可用于为将来的操作注册处理或事件时间计时器

  • 内置和自定义触发器

  • Flink内部有一些内置的触发器:

  • EventTimeTrigger:基于事件时间和watermark机制来对窗口进行触发计算。

  • ProcessingTimeTrigger:基于处理时间触发。

  • CountTrigger:窗口元素数超过预先给定的限制值的话会触发计算。

  • PurgingTrigger作为其它trigger的参数,将其转化为一个purging触发器。

WindowAssigner的默认触发器适用于很多案例。比如,所有基于事件时间的窗口分配器都用EventTimeTrigger作为默认触发器。该触发器会在watermark达到窗口的截止时间时直接触发计算输出。

猜你喜欢

转载自blog.csdn.net/wuxintdrh/article/details/107268220
今日推荐