2019年1月28日,阿里云宣布开源“计算王牌”实时计算平台Blink。回馈给ApacheFlink社区。官方称,计算延迟已经降到毫秒级,也就是你在浏览网页的时候,眨了一下眼睛,淘宝、天猫处理的信息已经刷新了17亿次。

作为一家对技术有追求、有渴望的公司,怎么少得了为Flink社区做些贡献呢?

夫子说

首先,本文所述均基于flink 1.5.4。

我们为什么扩展Flink-SQL?

由于Flink 本身SQL语法并不提供在对接输入源和输出目的的SQL语法。数据开发在使用的过程中需要根据其提供的Api接口编写Source和 Sink, 异常繁琐,不仅需要了解FLink 各类Operator的API,还需要对各个组件的相关调用方式有了解(比如kafka,redis,mongo,hbase等),并且在需要关联到外部数据源的时候没有提供SQL相关的实现方式,因此数据开发直接使用Flink编写SQL作为实时的数据分析时需要较大的额外工作量。

我们的目的是在使用Flink-SQL的时候只需要关心做什么,而不需要关心怎么做。不需要过多的关心程序的实现,专注于业务逻辑。

接下来,我们一起来看下Flink-SQL的扩展实现吧!

01、扩展了哪些flink相关sql

(1)创建源表语句

(2)创建输出表语句

(3)创建自定义函数

(4)维表关联

02、各个模块是如何翻译到flink的实现

(1)如何将创建源表的sql语句转换为flink的operator;

Flink中表的都会映射到Table这个类。然后调用注册方法将Table注册到environment。
StreamTableEnvironment.registerTable(tableName, table);
当前我们只支持kafka数据源。Flink本身有读取kafka 的实现类, FlinkKafkaConsumer09,所以只需要根据指定参数实例化出该对象。并调用注册方法注册即可。

另外需要注意在flink sql经常会需要用到rowtime, proctime, 所以我们在注册表结构的时候额外添加rowtime,proctime。
当需要用到rowtime的使用需要额外指定DataStream.watermarks(assignTimestampsAndWatermarks),自定义watermark主要做两个事情:1:如何从Row中获取时间字段。 2:设定最大延迟时间。

( 2 ) 如何将创建的输出表sql语句转换为flink的operator;

Flink输出Operator的基类是OutputFormat, 我们这里继承的是RichOutputFormat, 该抽象类继承OutputFormat,额外实现了获取运行环境的方法getRuntimeContext(), 方便于我们之后自定义metric等操作。

我们以输出到mysql插件mysql-sink为例,分两部分:
将create table 解析出表名称,字段信息,mysql连接信息。
该部分使用正则表达式的方式将create table 语句转换为内部的一个实现类。该类存储了表名称,字段信息,插件类型,插件连接信息。
继承RichOutputFormat将数据写到对应的外部数据源。
主要是实现writeRecord方法,在mysql插件中其实就是调用jdbc 实现插入或者更新方法。

(3)如何将自定义函数语句转换为flink的operator;

Flink对udf提供两种类型的实现方式:
(1)继承ScalarFunction
(2)继承TableFunction
需要做的将用户提供的jar添加到URLClassLoader, 并加载指定的class (实现上述接口的类路径),然后调用TableEnvironment.registerFunction(funcName, udfFunc);即完成了udf的注册。之后即可使用改定义的udf;

( 4 ) 维表功能是如何实现的?

流计算中一个常见的需求就是为数据流补齐字段。因为数据采集端采集到的数据往往比较有限,在做数据分析之前,就要先将所需的维度信息补全,但是当前flink并未提供join外部数据源的SQL功能。

实现该功能需要注意的几个问题:
(1)维表的数据是不断变化的
在实现的时候需要支持定时更新内存中的缓存的外部数据源,比如使用LRU等策略。
(2)IO吞吐问题
如果每接收到一条数据就串行到外部数据源去获取对应的关联记录的话,网络延迟将会是系统最大的瓶颈。这里我们选择阿里贡献给flink社区的算子RichAsyncFunction。该算子使用异步的方式从外部数据源获取数据,大大减少了花费在网络请求上的时间。
(3)如何将sql 中包含的维表解析到flink operator
为了从sql中解析出指定的维表和过滤条件, 使用正则明显不是一个合适的办法。需要匹配各种可能性。将是一个无穷无尽的过程。查看flink本身对sql的解析。它使用了calcite做为sql解析的工作。将sql解析出一个语法树,通过迭代的方式,搜索到对应的维表;然后将维表和非维表结构分开。

通过上述步骤可以通过SQL完成常用的从kafka源表,join外部数据源,写入到指定的外部目的结构中。

技本功丨用短平快的方式告诉你:Flink-SQL的扩展实现...相关推荐

  1. 技本功丨用短平快的方式告诉你:Flink-SQL的扩展实现

    2019年1月28日,阿里云宣布开源"计算王牌"实时计算平台Blink回馈给ApacheFlink社区.官方称,计算延迟已经降到毫秒级,也就是你在浏览网页的时候,眨了一下眼睛,淘宝 ...

  2. 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)

    2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的"圣杯战争".网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀.. ...

  3. 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

    本萌最近被一则新闻深受鼓舞,西工大硬核"女学神"白雨桐,获6所世界顶级大学博士录取通知书. 货真价值的才貌双全,别人家的孩子 高考失利与心仪的专业失之交臂,选择了软件工程这门自己完 ...

  4. 技本功丨收藏!斜杠青年与你共探微信小程序云开发(上篇)

    人设千万种,"高危"的大概有两种:好老公/老婆 & 学霸. 猪年第一瓜,演艺事业一帆风顺的翟XX,栽在了学霸的人设上,这件事深刻地教育了我们: 1.学习这件事情来不得一点虚 ...

  5. 技本功丨甲方大人来了之运维数据分析平台搭建实战

    袋鼠云日志团队时常遇到各种各样的甲方大人,毕竟我们是一个非常优秀的企业服务公司(自信满满),当然面对甲方大人的时候要做到处变不惊,临危不乱,镇定自若的接受需求-- 甲方大人的常用台词一定要记住:我们很 ...

  6. 技本功丨互联网+工业视觉异常检测分析

    胡丰--袋鼠云高级算法专家 袋鼠云人工智能实验室负责人.十年图像处理.模式识别.机器视觉等方面的研发工作,主要研究领域为:智能交通.工业视觉分析.OCR.视频智能质量诊断.智能球机跟踪.人脸等方向,发 ...

  7. 技本功丨呀~我不会写CSS之vertical-align(上集)

    某日阅读<CSS世界>,笔者的一段话鞭挞了我的灵魂.原文是这样的-- "说到这里,我就忍不住多说两句.很多其实工作很多年的前端开发人员,也可能不知道vertical-align的 ...

  8. 技本功丨知否知否,Redux源码竟如此意味深长(下集)

    上集回顾 Redux是如何使用的?首先再来回顾一下这个使用demo(谁让这段代码完整地展示了redux的使用) 如果有小伙伴对这段代码不是很理解的话,建议先去学习Redux的使用再来看这篇源码,这样更 ...

  9. mysql x key 组合_技本功丨浅谈MySQL的七种锁

    作者:宋丹琪(花名:三思)袋鼠云云服务部DBA团队 数据库工程师 时常会有开发的同学突然紧张兮兮地找我, 然后丢给我一个代码层面的 CannotAcquireLockException的报错, 一脸无 ...

最新文章

  1. ubuntu16.04下ROS最新换源方法,解决Hash sum mismatch 问题
  2. dede自定义表单增加添加时间怎么弄
  3. BCB写的简单的EXCEL合并
  4. AES加密解密算法Java实现
  5. 2020年汤家凤直播讲解1800题基础篇手写笔记-不定积分和定积分部分
  6. 在一个IIS上同时运行两个版本ASP.NET报错的
  7. php 数据库时间函数大全,PHP时间函数和SQL
  8. linux中更新perl的版本
  9. Linux20180528
  10. windows做ntp server,linux做ntp client端的配置方法
  11. rhel linux 自动 fsck,red hat as 4 启动报错:checking filesystems fsck.ext3: bad magic number ......
  12. [py]__name__ 属于哪个文件
  13. 【游戏】基于matlab GUI万年历【含Matlab源码 257期】
  14. 在 uniapp 中使用阿里图标
  15. 我们试用了市面上几款微信自动化软件,哪家弱哪家强?
  16. 笔记-3.路径动画+小球闯关练习
  17. 微信删除的聊天记录怎么恢复,教你两个方法
  18. MCU_如何通过硬件VID 查找生产厂家
  19. Nginx 性能优化 Gzip 压缩配置
  20. 什么是双因素验证 2FA,如何用 Python 实现?

热门文章

  1. android的交互方式,Android与js的交互方式
  2. Android studio吧,Android Studio 连接真机
  3. linux spidev 应用_嵌入式Linux设备树语法总结
  4. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法
  5. 两个时间的差值Java,Java如何找到两个时间之间的差值?
  6. java 字符串池 原理_《Java虚拟机原理图解》1.2.2、Class文件中的常量池详解(上)...
  7. 节能与新能源汽车技术路线图2.0 pdf_《节能与新能源汽车技术路线图(2.0版)》正式发布...
  8. php 自己电脑运行内存,php 统计网页打开耗时和脚本运行内存
  9. java高端架构_Java高端架构师
  10. 集合詳細學習 包括Vector ArrayList List等等的比較與實例