Flink 窗口 触发器 ContinuousEventTimeTrigger

短窗口的计算由于其窗口期较短,那么很快就能获取到结果,但是对于长窗口来说短窗口时间比较长,如果等窗口期结束才能看到结果,那么这份数据就不具备实时性,大多数情况我们希望能够看到一个长窗口的结果不断变动的情况,

对此Flink提供了ContinuousEventTimeTrigger连续事件时间触发器与ContinuousProcessingTimeTrigger连续处理时间触发器,指定一个固定时间间隔interval,不需要等到窗口结束才能获取结果,能够在固定的interval获取到窗口的中间结果。

ContinuousEventTimeTrigger

该类表示连续事件时间触发器,用在EventTime属性的任务流中,以事件时间的进度来推动定期触发。

<1> 其中的onElement方法:

	@Override
    public TriggerResult onElement(Object element, long timestamp, W window, TriggerContext ctx) throws Exception {

        if (window.maxTimestamp() <= ctx.getCurrentWatermark()) {
            // if the watermark is already past the window fire immediately
            return TriggerResult.FIRE;
        } else {
            ctx.registerEventTimeTimer(window.maxTimestamp());
        }

        ReducingState<Long> fireTimestamp = ctx.getPartitionedState(stateDesc);
        if (fireTimestamp.get() == null) {
            long start = timestamp - (timestamp % interval);
            long nextFireTimestamp = start + interval;
            ctx.registerEventTimeTimer(nextFireTimestamp);
            fireTimestamp.add(nextFireTimestamp);
        }

        return TriggerResult.CONTINUE;
    }

对于每一条数据都会经过onElement处理,

这部分是用于判断是否触发窗口函数或者注册一个窗口endTime的定时触发器,endTime定时器最终触发窗口函数,就能够得到一个最终的窗口结果。
一旦流水位线达到了窗口的endTime,那么就会触发最终的函数。

	/** When merging we take the lowest of all fire timestamps as the new fire timestamp. */
    private final ReducingStateDescriptor<Long> stateDesc =
            new ReducingStateDescriptor<>("fire-time", new Min(), LongSerializer.INSTANCE);

这部分,ReducingState是context调用getPartitionedState方法,返回下一次的窗口函数触发时间
getPartitionedState:检索可用于与之交互的State对象容错状态,范围为当前触发器调用的窗口和键。
如果获取到保存下一次触发时间的状态为null,那么就会初始化,这里的初始化逻辑:
假设当前时间戳为110,调用函数的间隔时间即interval为25,那么
start=110-110%25=110-10=100
nextFireTimestamp=100+25=125
这就是距离当前时间戳最近的触发时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾岛与鲸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值