共计 2455 个字符,预计需要花费 7 分钟才能阅读完成。
一、扩大 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…