作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈、交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代。在进行产品研发的过程中,技术小哥哥们能文能武,不断提升产品性能和体验的同时,也把这些提升和优化过程记录下来,现录入“袋鼠云研发手记”专栏中,以和业内童鞋们分享交流。

下为“袋鼠云研发手记”专栏第三期,本期作者为袋鼠云数栈引擎团队。

袋鼠云数栈引擎团队

袋鼠云数栈引擎团队拥有多名专家级别,经验丰富的后端开发工程师,分别支撑公司大数栈产品线的不同子项目的开发需求,从项目中提取并开源了FlinkX(基于Flink的数据同步),Jlogstash(logstash 的java 版本实现),FlinkStreamSQL(扩展原生FlinkSQL,实现流与维表的join)多个项目。

在长期的项目实践与产品迭代过程中,团队成员在 Hadoop技术栈上不断深耕探索,积累了丰富的经验与最佳实践。

第三期

数栈·开源 拓展FlinkSQL实现流与维表的join

FlinkStreamSQL 已经开源在Github上 目前已获380+Star

1、为什么要扩展FlinkSQL?

实时计算需要完全SQL化

SQL是数据处理中使用最广泛的语言。它允许用户简明扼要地声明他们的业务逻辑。大数据批计算使用SQL很常见,但是支持SQL的实时计算并不多。其实,用SQL开发实时任务可以极大降低数据开发的门槛,在袋鼠云数栈-实时计算模块,我们决定实现完全SQL化。

**数据计算采用SQL的优势
**
 声明式。用户只需要表达我想要什么,至于怎么计算那是系统的事情,用户不用关心。

自动调优。查询优化器可以为用户的 SQL 生成最有的执行计划。用户不需要了解它,就能自动享受优化器带来的性能提升。

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

稳定。SQL 是一个拥有几十年历史的语言,是一个非常稳定的语言,很少有变动。所以当我们升级引擎的版本时,甚至替换成另一个引擎,都可以做到兼容地、平滑地升级。

实时计算还需要流与维表的JOIN

在实时计算的世界里不只是流与流的JOIN,还需要流与维表的JOIN

在实时计算的世界里不只是流与流的JOIN,还需要流与维表的JOIN。在去年,袋鼠云数栈V3.0版本研发期间,当时最新版本——flink1.6中FlinkSQL,已经将SQL的优势应用到Flink引擎中,但还未支持流与维表的JOIN。

关于FlinkSQL

FlinkSQL于2017年7月开始面向阿里巴巴集团开放流计算服务的,虽然是一个非常年轻的产品,但是到双11期间已经支撑了数千个作业,在双11期间,Blink 作业的处理峰值达到了5+亿每秒,而其中仅 Flink SQL 作业的处理总峰值就达到了3亿/秒。

参考链接:https://yq.aliyun.com/articles/457438

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

2、所以要用FlinkSQL实现流与维表的join 分两步:

一、用Flink api实现维表的功能

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

Async I/O 是由阿里巴巴贡献给社区的,于1.2版本引入,主要目的是为了解决与外部系统交互时网络延迟成为了系统瓶颈的问题。具体介绍可以看这篇文章:http://wuchong.me/blog/2017/05/17/flink-internals-async-io/

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

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

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

所以解决的方法就是维表里的数据要缓存,可以全量缓存,这个主要是维表数据不大的情况,还有一个是LRU缓存,维表数据量比较大的情况。

LRU维表的实现

第二个问题是流延迟过来的数据这么跟之前的维表数据做关联。这个就涉及到维表数据需要存储快照数据,所以这样的场景用HBase 做维表是比较适合的,因为HBase 是天生支持数据多版本的。

ALL维表的实现

二、解析流与维表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

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

**3. Calcite继续解析select语句
**

Calcite继续解析select语句

袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join相关推荐

  1. 袋鼠云研发手记 | 袋鼠云EasyManager的TypeScript重构纪要...

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  2. 袋鼠云研发手记 | 袋鼠云EasyManager的TypeScript重构纪要

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  3. 袋鼠云研发手记 | 数栈DTinsight:详解FlinkX中的断点续传和实时采集

    袋鼠云云原生一站式数据中台PaaS--数栈,覆盖了建设数据中心过程中所需要的各种工具(包括数据开发平台.数据资产平台.数据科学平台.数据服务引擎等),完整覆盖离线计算.实时计算应用,帮助企业极大地缩短 ...

  4. 袋鼠云陈吉平:深耕国产自研数字化技术与服务,持续为客户创造价值

    在经济面临下行压力.疫情反复等不确定因素之下,推动数字化转型就成为了许多企业的"救命稻草".然而,较高的数字化转型门槛.不成系统的数据服务,以及缺乏规范的行业标准等都成了企业数字化 ...

  5. 「2020新商业潜力评选」结果隆重揭晓,袋鼠云荣登榜单

    今天,「2020新商业潜力人物·企业评选」结果在北京隆重揭晓! 「2020新商业潜力人物·企业评选」由知顿.紫金财经.新亦享.兴澜文化,联合国内多家学术研究机构.投资机构.商业领域创新领军企业共同发起 ...

  6. 袋鼠云数据中台专栏(五):数栈,企业级一站式数据中台PaaS

    本文作者:江枫 袋鼠云CTO,花名江枫,本名宁海元. 2007年加入淘宝,曾是双十一大促技术指挥部成员,"去IOE"数据库负责人. 打造过千亿级实时日志平台.手机淘宝日志分析创始人 ...

  7. 袋鼠云数栈基于CBO在Spark SQL优化上的探索

    原文链接:袋鼠云数栈基于CBO在Spark SQL优化上的探索 一.Spark SQL CBO选型背景 Spark SQL的优化器有两种优化方式:一种是基于规则的优化方式(Rule-Based Opt ...

  8. Iceberg在袋鼠云的探索及实践

    "数据湖"."湖仓一体"及"流批一体"等概念,是近年来大数据领域热度最高的词汇,在各大互联网公司掀起了一波波的热潮,各家公司纷纷推出了自己的 ...

  9. 云市场合作伙伴-袋鼠云获A轮融资,成立一年半获三轮投资超亿元

    创投市场再次风起.2017年7月,袋鼠云宣布,获得来自戈壁创投主投.元璟资本跟投的A轮融资,相对于当前冷淡的投资市场,此举也再次引发了行业对大数据.云计算技术创新企业的关注.据袋鼠云CEO陈吉平(花名 ...

最新文章

  1. 解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?
  2. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
  3. shell脚本--字符串处理和动态数组
  4. android alertdialog 背景透明,Android Alertdialog弹出框设置半透明背景
  5. java学习(153):字符输出流
  6. idou老师教你学istio:监控能力介绍
  7. 2015.7.29 上学前在家的最后一晚
  8. 51Nod 1256 乘法逆元 Label:exgcd
  9. jquery form表单序列化,并ajax实现提交后台
  10. 详解30道Vue面试题
  11. pygame基本实现塔防游戏
  12. linux build文件,从源代码到可执行文件——编译全过程解析
  13. 夫妻卖盲盒、年入16亿,揭秘泡泡玛特的暴利生意
  14. 免费PDF下载网站 Free Pdf Download Engine
  15. 物联网卡这样设置一下上网全程4G!建议收藏!
  16. 猿创征文|《Java》关键字大全-小结
  17. 微信隐藏功能:微信提现怎么免手续费?勤俭持家的福音,2步做到
  18. Mysql实现统计查询
  19. 分享 6 个百度出品的免费工具,你用过几个?
  20. HORMANN霍曼控制箱维修控制器维修BK150 FUE H

热门文章

  1. python 如何将视频文件的语音转换为文字
  2. 易语言python识别图片验证码_图片识别-打码平台-打码网站-识别验证码-图鉴网络科技有限公司...
  3. __DSB()指令的作用
  4. R语言使用qcauchy函数生成柯西分布分位数函数数据、使用plot函数可视化柯西分布分位数函数数据(Cauchy distribution)
  5. 如何从零开始学习SEM?
  6. Android 音视频难学?音视频(流媒体)开发学习也有套路
  7. reg query报错系统找不到指定的注册表项或值。
  8. 痛失阵地,又一家热门BT种子观影网站关停
  9. 傻瓜攻略(十六)——MATLAB实现txt文件复杂内容的读取
  10. 【龙讯module小课堂】浅谈对gap的认识:PWmat中修正gap的module