内容简要:一、实时计算Flink版SQL简介二、实时计算Flink版SQL上手示例三、开发常见问题和解法
实时计算Flink版SQL简介
(一)关于实时计算Flink版SQL
实时计算Flink版选择了SQL这种声明式语言作为顶层API,比较稳定,也方便用户使用。FlinkSQL具备流批统一的特性,给用户统一的开发体验,并且语义一致。另外,FlinkSQL能够自动优化,包括屏蔽流计算里面Stat的复杂性,也提供了自动优化的Plan,并且还集成了AutoPilot自动调优的功能。FlinkSQL的应用场景也比较广泛,包括数据集成、实时报表、实时风控,还有在线机器学习等场景。
(二)基本操作
在基本操作上,可以看到SQL的语法和标准SQL非常类似。示例中包括了基本的SELECT、FILTER操作。,可以使用内置函数,如日期的格式化,也可以使用自定义函数,比如示例中的汇率转换就是一个用户自定义函数,在平台上注册后就可以直接使用。
(三)维表LookupJoin
在实际的数据处理过程中,维表的LookupJoin也是一个比较常见的例子。
这里展示的是一个维表INNERJOIN示例。
例子中显示的SOURCE表是一个实时变化的订单信息表,它通过INNERJOIN去关联维表信息,这里标黄高亮的就是维表JOIN的语法,可以看到它和传统的批处理有一个写法上的差异,多了FORSYSTEM_TIMEASOF这个子句来标明它是一个维表JOIN的操作。SOURCE表每来一条订单消息,它都会触发维表算子,去做一次对维表信息的查询,所以把它叫做一个LookupJoin。
(四)WindowAggrgation
WindowAggrgation(窗口聚合)操作也是常见的操作,FlinkSQL中内置支持了几种常用的Window类型,比如TumblWindow,SssionWindow,HopWindow,还有新引入的CumulatWindow。
Tumbl
TumblWindow可以理解成固定大小的时间窗口,也叫滚窗,比如说5分钟、10分钟或者1个小时的固定间隔的窗口,窗口之间没有重叠。
Sssion
SssionWindow(会话窗口)定义了一个连续事件的范围,窗口定义中的一个参数叫做SssionGap,表示两条数据的间隔如果超过定义的时长,那么前一个Window就结束了,同时生成了一个新的窗口。
Hop
HopWindow不同于滚动窗口的窗口不重叠,滑动窗口的窗口之间可以重叠。滑动窗口有两个参数:siz和slid。siz为窗口的大小,slid为每次滑动的步长。如果slidsiz,则窗口会重叠,同一条数据可能会被分配到多个窗口;如果slid=siz,则等同于TumblWindow。如果slidsiz,窗口之间没有重叠且有间隙。
Cumulat
CumulatWindow(累积窗口),是Flink社区1.13版本里新引入的,可以对比HopWindow来理解,区别是从WindowStart开始不断去累积。示例中Window1、Window2、Window3是在不断地增长的。它有一个最大的窗口长度,比如我们定义WindowSiz是一天,然后Stp步长是1个小时,那么它会在一天中的每个小时产生累积到当前小时的聚合结果。
看一个具体的Window聚合处理示例。
如上图所示,比如说需要进行每5分钟单个用户的点击数统计。
源数据是用户的点击日志,我们期望算出每5分钟单个用户的点击总数,SQL中使用的是社区最新的WindowTVF语法,先对源表开窗,再GROUPBY窗口对应的属性window_start和window_nd,COUNT(*)就是点击数统计。
可以看到,当处理12:00到12:04的数据,有2个用户产生了4次点击,分别能统计出来用户Mary是3次,Bob是1次。在接下来一批数据里面,又来了3条数据,对应地更新到下一个窗口中,分别是1次和2次。
(五)GroupAggrgation
相对于WindowAggrgation来说,GroupAggrgation直接触发计算,并不需要等到窗口结束,适用的一个场景是计算累积值。
上图的例子是单个用户累积到当前的点击数统计。从Qury上看,写法相对简单一点,直接GROUPBYusr去计算COUNT(*),就是累积计数。
可以看到,在结果上和Window的输出是有差异的,在与Window相同的前4条输入数据,GroupAggrgation输出的结果是Mary的点击数已更新到3次,具体的计算过程可能是从1变成2再变成3,Bob是1次,随着后面3条数据的输入,Bob对应的点击数又会更新成2次,对结果是持续更新的过程,这和Window的计算场景是有一些区别的。
之前Window窗口里面输出的数据,在窗口结束后结果就不会再改变,而在GroupAggrgation里,同一个GroupKy的结果是会产生持续更新的。
(六)WindowAggrgationVsGroupAggrgation
更全面地对比一下Window和GroupAggrgation的一些区别。
WindowAggrgation在输出模式上是按时输出,是在定义的数据到期之后它才会输出。比如定义5分钟的窗口,结果是延迟输出的,比如00:00~00:05这个时间段,它会等整个窗口数据都到齐之后,才完整输出出来,并且结果只输出一次,不会再改变。
GroupAggrgation是数据触发,比如第一条数据来它就会输出结果,同一个Ky的第二条数据来结果会更新,所以在输出流的性质上两者也是不一样的。WindowAggrgation一般情况下输出的是AppndStram,而在GroupAggrgation输出的是UpdatStram。
在状态Stat处理上两者的差异也比较大。WindowAggrgation会自动清理过期数据,用户就不需要额外再去