flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)_flinksql calcite-程序员宅基地

技术标签: flink  实战技巧  Apache Flink  实时计算  大数据  sql  实时大数据  

图片

感谢您的小爱心(关注  +  点赞 + 再看),对博主的肯定,会督促博主持续的输出更多的优质实战内容!!!

1.序篇-本文结构

大数据羊说

大数据羊说

用数据提升美好事物发生的概率~

32篇原创内容

公众号

本文主要介绍 flink sql 与 calcite 之间的关系。flink sql 的解析主要依赖 calcite。

而博主通过此文抛砖引玉帮助大家理解 flink sql 在解析中是怎样依赖 calcite 的,以及 flink sql 解析的流程,sql parser 相关内容。希望对大家有所帮助。

本文通过以下几节进行介绍,对某个章节感兴趣的可以直接划到对应章节。

  1. 背景篇-一条 flink sql 的执行过程
  • 发挥自己的想象力

  • 看看 flink 的实现

  1. 简介篇-calcite 扮演的角色
  • calcite 是啥?

  • flink sql 为啥选择 calcite?

  1. 案例篇-calcite 的能力、案例
  • 先用用 calcite

  • 关系代数

  • calcite 必知的基础 model

  • calcite 的处理流程(以 flink sql 为例)

  • calcite 怎么做到这么通用?

  1. 原理剖析篇-calcite 在 flink sql 中大展身手
  • FlinkSqlParserImpl

  • FlinkSqlParserImpl 的生成

  1. 总结与展望篇

2.背景篇-一条 flink sql 的执行过程

本节先给大家大致描述一条 flink sql 的执行过程,不了解详细内容不要紧,主要先了解整个流程,有了全局视角之后,后续会详述细节。

在介绍一条 flink sql 的执行过程之前,先来看看 flink datastream 任务的执行过程,这对理解一条 flink sql 的执行过程有很大的帮助。

  • datastream:datastream 在使用时要在 flink datastream api 提供的各种 udf(比如 flatmap,keyedprocessfunction 等)中自定义处理逻辑,具体的业务执行逻辑都是敲代码、 java 文件写的,然后编译在 jvm 中执行,就和一个普通的 main 函数应用一模一样的流程。因为代码执行逻辑都是自己写的,所以这一部分相对好理解。

  • sql:java 编译器不能识别和编译一条 sql 进行执行,那么一条 SQL 是咋执行的呢?

2.1.先发挥自己的想象力

我们逆向思维进行考虑,如果想让一条 flink sql 按照我们的预期在 jvm 中执行,需要哪些过程。

  1. 整体来说:参考 datastream,如果 jvm 能执行 datastream java code 编译后的 class 文件,那么加一个 sql 解析层,能将 sql 逻辑解析为 datastream 的各种算子,然后编译执行不就 vans 了。

  2. sql parser:首先得有一个 sql parser 吧,得先能识别 sql 语法,将 sql 语法转化为 AST、具体的关系代数。

  3. 关系代数到 datastream 算子的映射:sql 逻辑解析为 datastream,需要有一个解析的映射逻辑吧。sql 是基于关系代数的,可以维护一个 sql 中的每个关系代数到具体 datastream 接口的映射关系,有了这些映射关系我们就可以将 sql 映射成一段可执行的 datastream 代码。举个例子:其可以将:

  • sql select xxx 解析为类似 datastream 中的 map

  • where xxx 解析为 filter

  • group by 解析成 keyby

  • sum(xx),count(xxx)可以解析为 datastream 中的 aggregate function

  • etc…

  1. 代码生成:有了 sql AST,sql 到 datasretam 算子的映射关系之后,就要进行具体的代码生成了。比如去解析 sql AST 中具体哪些字段用作 where 逻辑,哪些字段用作 group by,都需要生成对应具体的 datastream 代码。

  2. 运行:经过上述流程之后,就可以将一个 sql 翻译成一个 datastream 作业了,happy 的执行。

如下图所示,描绘了上述逻辑:

图片

12

那么这个和 flink 实际实现有啥异同呢?

flink 大致是这样做的,虽在 flink 本身的中间还有一些其他的流程,后来的版本也不是基于 datastream,但是整体的处理逻辑还是和上述一致的。

所以不了解整体流程的同学可以先按照上述流程进行理解。

按照 博主的脑洞 来总结一条 sql 的使命就是:sql -> AST -> codegen(java code) -> 让我们 run 起来好吗

2.2.看看 flink 的实现

图片

26

上面手绘可能看不清,下面这张图更清楚。

图片

28

标准的一条 flink sql 运行起来的流程如下:

Notes:刚开始对其中的 SqlNode,RelNode 概念可能比较模糊。先理解整个流程,后续会详细介绍这些概念。

  1. sql 解析阶段:calcite parser 解析(sql -> AST,AST 即 SqlNode Tree)

  2. SqlNode 验证阶段:calcite validator 校验(SqlNode -> SqlNode,语法、表达式、表信息)

  3. 语义分析阶段:SqlNode 转换为 RelNode,RelNode 即 Logical Plan(SqlNode -> RelNode)

  4. 优化阶段:calcite optimizer 优化(RelNode -> RelNode,剪枝、谓词下推等)

  5. 物理计划生成阶段:Logical Plan 转换为 Physical Plan(等同于 RelNode 转换成 DataSet\DataStream API)

  6. 后续的运行逻辑与 datastream 一致

可以发现 flink 的实现博主的脑洞 整体主要框架上面是一致的。多出来的部分主要是 SqlNode 验证阶段优化阶段

3.简介篇-calcite 在 flink sql 中的角色

大致了解了 一条 flink sql 的运行流程 之后,我们来看看 calcite 这玩意到底在 flink 里干了些啥。

根据上文总结来说 calcite 在 flink sql 中担当了 sql 解析、验证、优化功能。

图片

30

看着 calcite 干了这么多事,那 calcite 是个啥东东,它的定位是啥?

3.1.calcite 是啥?

calcite 是一个动态数据的管理框架,它可以用来构建数据库系统的不同的解析的模块,但是它不包含数据存储数据处理等功能。

calcite 的目标是一种方案,适应所有的需求场景,希望能为不同计算平台和数据源提供统一的 sql 解析引擎,但是它只是提供查询引擎,而没有真正的去存储这些数据。

图片

61

下图是目前使用了 calcite 能力的其他组件,也可见官网 https://calcite.apache.org/docs/powered_by.html 。

图片

4

简单来说的话,可以先理解为 calcite 具有这几个功能(当然还有其他很牛逼的功能,感兴趣可以自查官网)。

  1. 自定义 sql 解析器:比如说我们新发明了一个引擎,然后我们要在这个引擎上来创造一套基于 sql 的接口,那么我们就可以使用直接 calcite,不用自己去写一套专门的 sql 的解析器,以及执行以及优化引擎,calcite 人都有。

  2. sql parser(extends SqlAbstractParserImpl):将 sql 的各种关系代数解析为具体的 AST,这些 AST 都能对应到具体的 java model,在 java 的世界里面,对象很重要,有了这些对象(SqlSelectSqlNode),就可以根据这些对象做具体逻辑处理了。举个例子,如下图,一条简单的 select c,d from source where a = '6' sql,经过 calcite 的解析之后,就可以得到 AST model(SqlNode)。可以看到有 SqlSelectSqlIdentifierSqlIdentifierSqlCharStringLiteral

  3. sql validator(extends SqlValidatorImpl):根据语法、表达式、表信息进行 SqlNode 正确性校验。

  4. sql optimizer:剪枝、谓词下推等优化

上面的这些能力整体组成如下图所示:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34608620/article/details/120096391

智能推荐

软件测试流程包括哪些内容?测试方法有哪些?_测试过程管理中包含哪些过程-程序员宅基地

文章浏览阅读2.9k次,点赞8次,收藏14次。测试主要做什么?这完全都体现在测试流程中,同时测试流程是面试问题中出现频率最高的,这不仅是因为测试流程很重要,而是在面试过程中这短短的半小时到一个小时的时间,通过测试流程就可以判断出应聘者是否合适,故在测试流程中包含了测试工作的核心内容,例如需求分析,测试用例的设计,测试执行,缺陷等重要的过程。..._测试过程管理中包含哪些过程

政府数字化政务的人工智能与机器学习应用:如何提高政府工作效率-程序员宅基地

文章浏览阅读870次,点赞16次,收藏19次。1.背景介绍政府数字化政务是指政府利用数字技术、互联网、大数据、人工智能等新技术手段,对政府政务进行数字化改革,提高政府工作效率,提升政府服务质量的过程。随着人工智能(AI)和机器学习(ML)技术的快速发展,政府数字化政务中的人工智能与机器学习应用也逐渐成为政府改革的重要内容。政府数字化政务的人工智能与机器学习应用涉及多个领域,包括政策决策、政府服务、公共安全、社会治理等。在这些领域,人工...

ssm+mysql+微信小程序考研刷题平台_mysql刷题软件-程序员宅基地

文章浏览阅读219次,点赞2次,收藏4次。系统主要的用户为用户、管理员,他们的具体权限如下:用户:用户登录后可以对管理员上传的学习视频进行学习。用户可以选择题型进行练习。用户选择小程序提供的考研科目进行相关训练。用户可以进行水平测试,并且查看相关成绩用户可以进行错题集的整理管理员:管理员登录后可管理个人基本信息管理员登录后可管理个人基本信息管理员可以上传、发布考研的相关例题及其分析,并对题型进行管理管理员可以进行查看、搜索考研题目及错题情况。_mysql刷题软件

根据java代码描绘uml类图_Myeclipse8.5下JAVA代码导成UML类图-程序员宅基地

文章浏览阅读1.4k次。myelipse里有UML1和UML2两种方式,UML2功能更强大,但是两者生成过程差别不大1.建立Test工程,如下图,uml包存放uml类图package com.zz.domain;public class User {private int id;private String name;public int getId() {return id;}public void setId(int..._根据以下java代码画出类图

Flume自定义拦截器-程序员宅基地

文章浏览阅读174次。需求:一个topic包含很多个表信息,需要自动根据json字符串中的字段来写入到hive不同的表对应的路径中。发送到Kafka中的数据原本最外层原本没有pkDay和project,只有data和name。因为担心data里面会空值,所以根同事商量,让他们在最外层添加了project和pkDay字段。pkDay字段用于表的自动分区,proejct和name合起来用于自动拼接hive表的名称为 ..._flume拦截器自定义开发 kafka

java同时输入不同类型数据,Java Spring中同时访问多种不同数据库-程序员宅基地

文章浏览阅读380次。原标题:Java Spring中同时访问多种不同数据库 多样的工作要求,可以使用不同的工作方法,只要能获得结果,就不会徒劳。开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文以在Spring框架下开发一个Sp..._根据输入的不同连接不同的数据库

随便推点

EFT试验复位案例分析_eft电路图-程序员宅基地

文章浏览阅读3.6k次,点赞9次,收藏25次。本案例描述了晶振屏蔽以及开关电源变压器屏蔽对系统稳定工作的影响, 硬件设计时应考虑。_eft电路图

MR21更改价格_mr21 对于物料 zba89121 存在一个当前或未来标准价格-程序员宅基地

文章浏览阅读1.1k次。对于物料价格的更改,可以采取不同的手段:首先,我们来介绍MR21的方式。 需要说明的是,如果要对某一产品进行价格修改,必须满足的前提条件是: ■ 1、必须对价格生效的物料期间与对应会计期间进行开启; ■ 2、该产品在该物料期间未发生物料移动。执行MR21,例如更改物料1180051689的价格为20000元,系统提示“对于物料1180051689 存在一个当前或未来标准价格”,这是因为已经对该..._mr21 对于物料 zba89121 存在一个当前或未来标准价格

联想启天m420刷bios_联想启天M420台式机怎么装win7系统(完美解决usb)-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏13次。[文章导读]联想启天M420是一款商用台式电脑,预装的是win10系统,用户还是喜欢win7系统,该台式机采用的intel 8代i5 8500CPU,在安装安装win7时有很多问题,在安装win7时要在BIOS中“关闭安全启动”和“开启兼容模式”,并且安装过程中usb不能使用,要采用联想win7新机型安装,且默认采用的uefi+gpt模式,要改成legacy+mbr引导,那么联想启天M420台式电..._启天m420刷bios

冗余数据一致性,到底如何保证?-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏9次。一,为什么要冗余数据互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。水平切分会有一个patition key,通过patition key的查询能..._保证冗余性

java 打包插件-程序员宅基地

文章浏览阅读88次。是时候闭环Java应用了 原创 2016-08-16 张开涛 你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题:1、程序代码和依赖都是人工上传到服务器,不是通过工具进行部署和发布;2、目录结构没有规范,jar启动时通过-classpath任意指定;3、fat jar,把程序代码、配置文件和依赖jar都打包到一个jar中,改配置..._那么需要把上面的defaultjavatyperesolver类打包到插件中

VS2015,Microsoft Visual Studio 2005,SourceInsight4.0使用经验,Visual AssistX番茄助手的安装与基本使用9_番茄助手颜色-程序员宅基地

文章浏览阅读909次。1.得下载一个番茄插件,按alt+g才可以有函数跳转功能。2.不安装番茄插件,按F12也可以有跳转功能。3.进公司的VS工程是D:\sync\build\win路径,.sln才是打开工程的方式,一个是VS2005打开的,一个是VS2013打开的。4.公司库里的线程接口,在CmThreadManager.h 里,这个里面是我们的线程库,可以直接拿来用。CreateUserTaskThre..._番茄助手颜色

推荐文章

热门文章

相关标签