加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

发布时间:2018-11-08 10:42:25 所属栏目:教程 来源:孙金城
导读:一、实际问题 我们知道在流计算场景中,数据是源源不断的流入的,数据流永远不会结束,那么计算就永远不会结束,如果计算永远不会结束的话,那么计算结果何时输出呢?本篇将介绍Apache Flink利用持续查询来对流计算结果进行持续输出的实现原理。 二、数据管

上面Append Only 和 Update两种场景在MySQL上面都可以利用Trigger机制模拟 持续查询的概念,也就是说数据表中每次数据变化,我们都触发一次相同的查询计算(只是计算时候数据的集合发生了变化),因为数据表不断的变化,这个表就可以看做是一个动态表Dynamic Table,而查询SQL(select * from flink_tab_ts) 被触发器Trigger在满足某种条件后不停的触发计算,进而也不断地产生新的结果。这种作用在Dynamic Table,并且有某种机制(Trigger)不断的触发计算的查询我们就称之为 持续查询。

那么到底静态查询和动态查询的关系是什么呢?在语义上 持续查询 中的每一次查询计算的触发都是一次静态查询(相对于当时查询的时间点), 在实现上 Apache Flink会利用上一次查询结果+当前记录 以增量的方式完成查询计算。

特别说明: 上面我们利用 数据变化+Trigger方式描述了持续查询的概念,这里有必要特别强调一下的是数据库中trigger机制触发的查询,每次都是一个全量查询,这与Apache Flink上面流计算的持续查询概念相同,但实现机制完全不同,Apache Flink上面的持续查询内部实现是增量处理的,随着时间的推移,每条数据的到来实时处理当前的那一条记录,不会处理曾经来过的历史记录!

七、Apache Flink 如何做到持续查询

1. 动态表上面持续查询

在 《Apache Flink 漫谈系列 - 流表对偶(duality)性》 中我们了解到流和表可以相互转换,在Apache Flink流计算中携带流事件的Schema,经过算子计算之后再产生具有新的Schema的事件,流入下游节点,在产生新的Schema的Event和不断流转的过程就是持续查询作用的结果,如下图:

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

2. 增量计算

我们进行查询大多数场景是进行数据聚合,比如查询SQL中利用count,sum等aggregate function进行聚合统计,那么流上的数据源源不断的流入,我们既不能等所有事件流入结束(永远不会结束)再计算,也不会每次来一条事件就像传统数据库一样将全部事件集合重新整体计算一次,在持续查询的计算过程中,Apache Flink采用增量计算的方式,也就是每次计算都会将计算结果存储到state中,下一条事件到来的时候利用上次计算的结果和当前的事件进行聚合计算,比如 有一个订单表,如下:

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

一个简单的计数和求和查询SQL:

  1. // 求订单总数和所有订单的总金额 
  2. select count(id) as cnt,sum(amount)as sumAmount from order_tab; 

这样一个简单的持续查询计算,Apache Flink内部是如何处理的呢?如下图:

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

如上图,Apache Flink中每来一条事件,就进行一次计算,并且每次计算后结果会存储到state中,供下一条事件到来时候进行计算,即:

  1. result(n) = calculation(result(n-1), n)。 

3. 无PK的Append Only 场景

在实际的业务场景中,我们只需要进行简单的数据统计,然后就将统计结果写入到业务的数据存储系统里面,比如上面统计订单数量和总金额的场景,订单表本身是一个append only的数据源(假设没有更新,截止到2018.5.14日,Apache Flink内部支持的数据源都是append only的),在持续查询过程中经过count(id),sum(amount)统计计算之后产生的动态表也是append only的,种场景Apache Flink内部只需要进行aggregate function的聚合统计计算就可以,如下:

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

4. 有PK的Update 场景

现在我们将上面的订单场景稍微变化一下,在数据表上面我们将金额字段amount,变为地区字段region,数据如下:

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读