一、扩大FlinkSQL实现流与维表的join

二、为什么要扩大FlinkSQL?

1、实时计算须要齐全SQL化

SQL是数据处理中应用最宽泛的语言。它容许用户简明扼要地申明他们的业务逻辑。大数据批计算应用SQL很常见,然而反对SQL的实时计算并不多。其实,用SQL开发实时工作能够极大升高数据开发的门槛,在袋鼠云数栈-实时计算模块,咱们决定实现齐全SQL化。

数据计算采纳SQL的劣势

☑ 申明式。用户只须要表白我想要什么,至于怎么计算那是零碎的事件,用户不必关怀。

☑ 主动调优。查问优化器能够为用户的 SQL 生成最有的执行打算。用户不须要理解它,就能主动享受优化器带来的性能晋升。

☑ 易于了解。很多不同行业不同畛域的人都懂 SQL,SQL 的学习门槛很低,用 SQL 作为跨团队的开发语言能够很大地提高效率。

☑ 稳固。SQL 是一个领有几十年历史的语言,是一个十分稳固的语言,很少有变动。所以当咱们降级引擎的版本时,甚至替换成另一个引擎,都能够做到兼容地、平滑地降级。

参考链接:https://blog.csdn.net/weixin_...

2、实时计算还须要流与维表的JOIN

在实时计算的世界里不只是流与流的JOIN,还须要流与维表的JOIN。在去年,袋鼠云数栈V3.0版本研发期间,过后最新版本——flink1.6中FlinkSQL,曾经将SQL的劣势利用到Flink引擎中,但还未反对流与维表的JOIN。

FlinkSQL于2017年7月开始面向阿里巴巴团体凋谢流计算服务的,尽管是一个十分年老的产品,然而到双11期间曾经撑持了数千个作业,在双11期间,Blink 作业的解决峰值达到了5+亿每秒,而其中仅 Flink SQL 作业的解决总峰值就达到了3亿/秒。

参考链接:https://yq.aliyun.com/article...

里先解释下什么是维表;维表是动静表,表里所存储的数据有可能不变,也有可能定时更新,然而更新频率不是很频繁。在业务开发中个别的维表数据存储在关系型数据库如mysql,oracle等,也可能存储在hbase,redis等nosql数据库。

三、FlinkSQL实现流与维表的join分步走

1、用Flink api实现维表的性能

要实现维表性能就要用到 Flink Aysnc I/O 这个性能,是由阿里巴巴奉献给Apache Flink的。

Async I/O 是由阿里巴巴奉献给社区的,于1.2版本引入,次要目标是为了解决与内部零碎交互时网络提早成为了零碎瓶颈的问题。

具体介绍能够看这篇文章:http://wuchong.me/blog/2017/0...

对应到Flink 的api就是RichAsyncFunction 这个抽象类,继层这个抽象类实现外面的open(初始化),asyncInvoke(数据异步调用),close(进行的一些操作)办法,最次要的是实现asyncInvoke 外面的办法。

流与维表的join会碰到两个问题:

1)第一个是性能问题。

因为流速要是很快,每一条数据都须要到维表做下join,然而维表的数据是存在第三方存储系统,如果实时拜访第三方存储系统,不仅join的性能会差,每次都要走网络io;还会给第三方存储系统带来很大的压力,有可能会把第三方存储系统搞挂掉。

所以解决的办法就是维表里的数据要缓存,能够全量缓存,这个次要是维表数据不大的状况,还有一个是LRU缓存,维表数据量比拟大的状况。

2)第二个问题是流提早过去的数据这么跟之前的维表数据做关联。

这个就波及到维表数据须要存储快照数据,所以这样的场景用HBase 做维表是比拟适宜的,因为HBase 是天生反对数据多版本的。

2、解析流与维表join的SQL语法转化成底层的FlinkAPI

因为FlinkSQL曾经做了大部分SQL场景,咱们不可能在去解析SQL的所有语法,在把他转化成底层FlinkAPI。

所以咱们做的就是解析SQL语法,来找到join表里有没有维表,如果有维表,那咱们会把这个join的维表的语句独自拆来,用Flink的TableAPI和StreamAPi 生成新DataStream,在把这个DataStream与其余的表在做join这样就能用SQL来实现流与维表的join语法了。

SQL解析的工具就是用Apache calcite,Flink也是用这个框架做SQL解析的。所以所有语法都是能够解析的。

1)DEMO SQL

insert
into

  MyResult   select         d.channel,         d.info   from          (       select a.*,b.info           from                    MyTable a           join sideTable b                    on a.channel=b.name               where a.channel = 'xc2’                       and a.pv=10     ) as d 

2)Calcite解析Insert into语句,拆分出子语句

select a.*,b.info from MyTable a join sideTable b on a.channel=b.name

  where a.channel = 'xc2' and a.pv=10

select d.channel, d.info from d

insert into MyResult

3) Calcite持续解析select语句

old: select a.*,b.info from MyTable a join sideTable b on a.channel=b.name
where a.channel = 'xc2' and a.pv=10



数栈是云原生—站式数据中台PaaS,咱们在github和gitee上有一个乏味的开源我的项目:FlinkX,FlinkX是一个基于Flink的批流对立的数据同步工具,既能够采集动态的数据,也能够采集实时变动的数据,是全域、异构、批流一体的数据同步引擎。大家喜爱的话请给咱们点个star!star!star!

github开源我的项目:https://github.com/DTStack/fl...

gitee开源我的项目:https://gitee.com/dtstack_dev...