你不了解的flink特性-trigger

浪尖 浪尖聊大数据

今天主要是聊一下flink的窗口计算的一个小功能-trigger。
窗口这个概念还是比较好理解的,就是在某一个纬度(时间,条数等)上选取一段范围,这个范围就是窗口,然后我们后面的计算针对这个窗口进行。今天的例子主要是针对时间窗口进行讲解。

不得不说flink支持的窗口操作还是比较丰富的:

会话窗口、滚动窗口、滑动窗口等。

就拿滑动窗口举例子,滑动窗口故名思意就是除了在时间维度上开窗之外,我们还要指定一下这个窗口以什么样的步子在时间尺度上移动,这个就叫滑动间隔,如下图:

从而可以得到滑动窗口两个重要的参数就是窗口大小和滑动间隔。

对于flink的窗口操作,尤其是基于事件时间的窗口操作,大家还要掌三个个重要的知识点:

  1. 窗口分配器:就是决定着流入flink的数据,该属于哪个窗口。

  2. 时间戳抽取器/watermark生成器:抽取时间戳并驱动着程序正常执行。

  3. trigger:决定着数据啥时候落地。

这些我们后面会在星球里一一讲解,本文主要是讲一下trigger。

回想一下spark streaming的窗口操作,其实就是一个更大的批处理,窗口按照指定的滑动间隔去滑动,然后窗口和滑动间隔的大小是批处理的整数倍。

数据啥时候处理结束并落地呢?

滑动间隔就是计算的周期。那么处理时间就是从窗口开始到数据落地所需要的时间,该时间正常情况下要小于等于滑动间隔的,否则就会产生队列挤压。

其实,这个思想也是spark streaming 的微批处理的思想,也是基于处理时间的思想。

而flink不是,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达到窗口的截止时间时直接触发计算输出。

©著作权归作者所有:来自51CTO博客作者mob604756ed02fe的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. flink自定义trigger-实现窗口随意输出
  2. 苹果macOS 常用快捷键分享
  3. 重要|flink的时间及时区问题解决
  4. 搭建NTP时间服务器
  5. spark streaming窗口及聚合操作后如何管理offset
  6. 什么是DevOps?微软架构师的回答来了
  7. 史上最费时间修理的一台电脑
  8. 查看域用户最后登录时间的方法
  9. 华为认证考试时间查询|预约考试时间|报名条件|报考指导

随机推荐

  1. 跟踪来自特定来源的用户
  2. 是否有办法阻止contenteditable的插入符
  3. Django JavaScript翻译空目录(i18n / jsi1
  4. jsPDF中使用.text()方法的字母间距
  5. 如何在javascript中合并2个对象[重复]
  6. Android WebView 实现JS相互调用 JsBridg
  7. JS/PHP 浮点数精确运算
  8. 使用Jquery动态添加HTML返回[Object obje
  9. 将JavaScript命名空间拆分为多个文件
  10. 使用延迟到多个ajax调用的链循环