Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Flink】第二十八篇:Flink SQL 与 Apache Calcite

【Flink】第二十八篇:Flink SQL 与 Apache Calcite

作者头像
章鱼carl
发布于 2022-03-31 03:22:09
发布于 2022-03-31 03:22:09
2.4K0
举报
文章被收录于专栏:章鱼carl的专栏章鱼carl的专栏

源码分析系列推荐:

【Flink】第四篇:【迷思】对update语义拆解D-、I+后造成update原子性丢失

【Flink】第十五篇:Redis Connector 数据保序思考

【Flink】第十六篇:源码角度分析 sink 端的数据一致性

【Flink】第二十四篇:源码角度分析 DataStream API 调用逻辑

【Flink】第二十五篇:源码角度分析作业提交逻辑

【Flink】第二十六篇:源码角度分析Task执行过程

【Flink】第二十七篇:三天撸了一个 Flink SQL 字段血缘算法

接上篇 【Flink】第二十七篇:三天撸了一个 Flink SQL 字段血缘算法 ,从本篇开始深入Flink SQL的解析流程及原理。

本文内容:

  1. Apache Calcite介绍
  2. 从源码工程中一瞥Flink SQL中的Calcite

DSL & GPL

通用编程语言(General Purpose Language):

可以用来编写任意计算机程序,并且能表达任何的可被计算的逻辑,同时也是图灵完备的。例如,Java、C、Python

领域专用语言(Domain Specific Language):

能够高效的描述特定领域的世界观和方法论的语言。例如,SQL、HTML & CSS、Regex。

平衡本质:

DSL 通过在表达能力上做妥协以换取在某一领域内的高效表达 (世界级软件开发大师 Martin Fowler 对于DSL的解释)。有限的表达能力就成为了 GPL 和 DSL 之间的一条界限。DSL高效简洁的领域语言,与通用语言相比能极大降级理解和使用难度,同时极大提高开发效率的语言。

DSL需要有特定解析器对其进行构建:

  • 没有计算和执行的概念;
  • 本身不需直接表示计算;
  • 只需声明规则和事实及某些元素之间的层级和关系;

解析器概念

功能:

1. 设计词法、语法、语义:定义 DSL 中的元素是什么样的,元素代表什么意思

2. 实现 Parser,对 DSL 解析,最终通过解释器来执行

核心概念:

1. 抽象语法树(Abstract Syntax Tree,AST):

抽象语法树是源代码结构的一种抽象表示,它以树的形状表示语言的语法结构。

抽象语法树一般可以用来进行代码语法的检查,代码风格的检查,代码的格式化,代码的高亮,代码的错误提示以及代码的自动补全等等。

2. 词法解析器 Lexer:

词法分析是指在计算机科学中,将字符序列转换为单词(Token)的过程。

3. 语法解析器 Parser:

语法解析器通常作为 编译器解释器 出现。它的作用是进行语法检查,并构建由输入单词(Token)组成的数据结构(AST)。

常见解释器:Apache Antlr、SQLParser、Apache Calcite(JavaCC)

Apache Antlr


概念:

它的鼻祖级工具是lex、yacc。 举例,如何将java源码转换成字节码?实现这个需求,需要按照java规范,将源码中的每个词法(如public、class、package)、类名、包名等转换成对应的字节码。那么如何取得这些词、类名、包名、变量名呢? 正则表达式在这里可能就显得力不从心了。因为除了要寻找这些词法外,还需要处理复杂的上下文关系(如变量的作用范围)。这些正是antlr擅长的地方。

谁在使用:HiveSpark、Oracle、Presto、Elasticsearch

核心组件: 词法Lexer + 语法Parser

1. 词法Lexer:

  • 标识符,即各类编程语言中所说的以下划线、字母开头的字符串
  • 字面量,英文叫Literal,其实就是可以当作值的东西,放在操作符两边。如数字、单引号字符串、双引号字符串、各个进制写法等
  • 字符,单字符(!、~、=、>等)、双字符(>=、<=)等
  • 关键字,如Java中的class、package、import、public等

2. 语法Parser:

  • 例如,变量定义、类定义

词法和语法规则配置放在 .g4 文件里。

Apache Calcite

概念:

是面向 Hadoop 新的查询引擎,它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力,除此之外,Calcite 还提供了 OLAP 和 流处理 的查询引擎。

使用Calcite作为SQL解析与处理引擎有:Hive、Drill、Flink、Phoenix、Storm

历史:

起源于Hive,原名optiq,为 Hive 提供基于成本模型的优化。2014年成为Apache孵化项目,并更名Calcite。建设者是Julian Hyde,曾经是 Oracle 引擎的主要开发者、SQLStream 公司的创始人和主架构师、Pentaho BI 套件中 OLAP 部分的架构师和主要开发者。现在他在 Hortonworks 公司负责 Calcite 项目。

设计目标:

“ one size fits all (一种查询引擎,连接多种前端和后端)”,希望能为不同计算平台和数据源提供统一的查询引擎,并以类似传统数据库的访问方式(SQL 和高级查询优化)来访问Hadoop 上的数据。

设计目标是成为动态的数据管理系统,所以在具有很多特性的同时,也舍弃了比如数据存储、处理数据的算法和元数据仓库。在应用和数据存储及数据处理引擎之间很好地扮演中介的角色。

特性:

1. 支持标准 SQL 语言;

2. 独立于编程语言和数据源,可以支持不同的前端和后端;

3. 支持关系代数、可定制的逻辑规划规则和基于成本模型优化的查询引擎;

4. 支持物化视图(materialized view)的管理(创建、丢弃、持久化和自动识别);

Calcite 的物化视图是从传统的关系型数据库系统(Oracle/DB2/Teradata/SQL server)借鉴而来,传统概念上,一个物化视图包含一个 SQL 查询和这个查询所生成的数据表。

物化视图可以进一步扩展为 DIMMQ(Discardable, In-Memory, Materialized Query)。简单地说,DIMMQ 就是内存中可丢弃的物化视图,它是高级别的缓存。

5. 基于物化视图的 Lattice 和 Tile 机制,以应用于 OLAP 分析;

6. 支持对流数据的查询。

Calcite 对其 SQL 和关系代数进行了扩展以支持流查询。Calcite 的 SQL 语言是标准 SQL 的扩展,而不是类 SQL,这个差别非常重要。

核心组件:

1. 模板引擎FreeMarker

语法模板文件 parserImpls.ftl + 配置文件 conf.fmpp -> .jj 模板文件

2. 语法解析器JavaCC

.jj 模板文件 -> 生成解析器代码文件 .java

在Flink源码工程中的体现:

工程机理:

例如,Flink SQL中的 WATERMARK FOR AS 定义水位线,我们来看看涉及到哪些东西:

1. parserImpls.ftl:

主要完成:

(1) 定义三个成员变量:eventTimeColumnName、pos、watermarkStrategy

(2) 为事件时间属性名eventTimeColumnName赋值

(3) 为字符串位置偏移量pos赋值

(4) 为水位线所属的AST树节点SqlNode赋值watermarkStrategy

这里的赋值是由calcite codegen生成的解析器代码完成的(下节介绍),而SqlWatermark是引入的类,我们看一看这个SqlNode:

这个SqlWatermark本质是对SqlNode的规则定义,继承自SqlCall,UML如下,

所以本质就是一个SqlNode。

但是在哪里引入的SqlWatermark类呢?我们看Parser.tdd

而在这个文件的开始有这个定义:

FlinkSqlParserImpl即为Calcite根据DSL文件描述文件parserImpls.ftl生成的类名的定义。

而parserImpls.ftl和Parser.tdd是如何产生联系的呢?我们看config.fmpp,

至此,我们大致了解Flink是如何在工程角度与Calcite相遇的,更多细节限于笔者能力和时间有限就不过多展开了。下一篇将介绍Calcite在Flink中的解析流程及一些细节。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 章鱼沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)
全网第一个 flink sql 实战,本文主要介绍 flink sql 与 calcite 之间的关系。flink sql 的解析主要依赖 calcite。
公众号:大数据羊说
2022/04/04
2.5K0
flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)
统一元数据:数据血缘
数据血缘(Data Lineage):是数据治理中元数据管理领域下的一个子范畴,是数据的溯源过程,获得数据产生链路,发现数据的关联关系,目的是解决"数据的哲学三问":我是谁,我从哪里来,我到哪里去。
Yiwenwu
2024/05/10
3.1K1
统一元数据:数据血缘
看这篇就够了丨基于Calcite框架的SQL语法扩展探索
Calcite 在大数据系统中有着广泛的运用,比如 Apache Flink, Apache Drill 等都大量使用了 Calcite,理解 Calcite 的原理可以说已经成为理解大数据系统中 SQL 访问层实现原理的必备条件之一。
袋鼠云数栈
2023/01/12
4.9K0
Calcite系列(六):执行流程-语法解析
目前广泛使用的语法解析框架主要包括ANTLR、JavaCC和Yacc等。在大数据领域中,很多计算引擎都是基于ANTLR进行语法解析,例如 Hive、Spark和Presto等都基于ANTLR进行处理。然而,Calcite使用JavaCC编译器进行语法解析。
Yiwenwu
2024/04/19
8910
Calcite系列(六):执行流程-语法解析
【Flink】第二十七篇:三天撸了一个 Flink SQL 字段血缘算法
【Flink】第四篇:【迷思】对update语义拆解D-、I+后造成update原子性丢失
章鱼carl
2022/03/31
2.6K0
【Flink】第二十七篇:三天撸了一个 Flink SQL 字段血缘算法
如何实现一个SQL解析器
随着技术的不断的发展,在大数据领域出现了越来越多的技术框架。而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询。SQL作为一个学习成本很低的语言,支持SQL进行数据查询可以降低用户使用大数据的门槛,让更多的用户能够使用大数据。
2020labs小助手
2022/10/24
2.7K0
Apache Calcite原理极简入门
Apache Calcite 是独立于存储与执行的SQL解析、优化引擎,广泛应用于各种离线、搜索、实时查询引擎,如Drill、Hive、Kylin、Solr、flink、Samza等。本文结合hive中基于代价的优化,解析calcite优化引擎的实现原理。
大数据真好玩
2020/06/07
2.5K0
TiDB SQL Parser 的实现
其中,SQL Parser的功能是把SQL语句按照SQL语法规则进行解析,将文本转换成抽象语法树(AST),这部分功能需要些背景知识才能比较容易理解,我尝试做下相关知识的介绍,希望能对读懂这部分代码有点帮助。
mazhen
2023/11/24
6750
TiDB SQL Parser 的实现
【Flink】第二十九篇:源码分析 Blink Planner
【Flink】第四篇:【迷思】对update语义拆解D-、I+后造成update原子性丢失
章鱼carl
2022/03/31
2.3K0
【Flink】第二十九篇:源码分析 Blink Planner
Apache Calcite 功能简析及在 Flink 的应用
• Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块
KyleMeow
2018/09/02
7.9K0
Apache Calcite 功能简析及在 Flink 的应用
【Flink SQL】Apache Calcite 架构剖析
Apache Calcite 是一个动态的数据管理框架, 可以实现 SQL 的解析、验证、优化和执行。Calcite 是模块化和插件式的, 解析、验证、优化和执行的步骤都对应着一个相对独立的模块。用户可以选择使用其中的一个或多个模块,也可以对任意模型进行定制化扩展。
王知无-import_bigdata
2023/04/07
1.1K0
【Flink SQL】Apache Calcite 架构剖析
个推基于Flink SQL建设实时数仓实践
作为一家数据智能企业,个推在服务垂直行业客户的过程中,会涉及到很多数据实时计算和分析的场景,比如在服务开发者时,需要对App消息推送的下发数、到达数、打开率等后效数据进行实时统计;在服务政府单位时,需要对区域内实时人口进行统计和画像分析。为了更好地支撑大数据业务发展,个推也建设了自己的实时数仓。相比Storm、Spark等实时处理框架,Flink不仅具有高吞吐、低延迟等特性,同时还支持精确一次语义(exactly once)、状态存储等特性,拥有很好的容错机制,且使用门槛低、易上手、开发难度小。因此,个推主要基于Flink SQL来解决大部分的实时作业需求。
个推
2022/03/28
1.3K1
个推基于Flink SQL建设实时数仓实践
Flink Table API/SQL 是如何变成程序运行的
如上图,最下面一层是 Process Function ,可以去做一些有状态的计算,注册 Timer 定时器,可以做更复杂的操作,灵活性更高,可以做非常复杂的定制开发;
kk大数据
2020/12/29
1.2K0
Flink Table API/SQL 是如何变成程序运行的
[Spark SQL] 源码解析之Parser
Parser就是将SQL字符串切分成一个个Token,再根据一定语义规则解析为一棵语法树。我们写的sql语句只是一个字符串而已,首先需要将其通过词法解析和语法解析生成语法树,Spark1.x版本使用的是scala原生的parser语法解析器,从2.x后改用的是第三方语法解析工具ANTLR4, 在性能上有了较大的提升。
UFO
2018/08/29
2.5K0
Calcite技术研究
Apache Calcite是一个基础的软件框架,它提供了查询处理、查询优化以及查询语言支持的能力。很多流行的开源数据处理系统例如Apache Hive,Apache Storm,ApacheFlink,Druid等都采用了它。
Fayson
2020/02/24
2.4K0
Calcite技术研究
基于Calcite自定义SQL解析器
这本应该是《我也能写数据库》系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了。
麒思妙想
2020/07/10
3.5K0
Antlr4实战:统一SQL路由多引擎
ANTLR是一款功能强大的语法分析器生成器,可用来读取、处理、执行和转换结构化文本或二进制文件。它被广泛应用于学术界和工业界构建各种语言、工具和框架。Antlr在Hadoop整个生态系统应用较为广泛,如Hive 词法文件是Antlr3写的;Presto词法文件也Antlr4实现的;SparkSQL词法文件是用Presto的词法文件改写的;还有HBase的访问客户端Phoenix也用Antlr工具进行SQL解析的等等。
用户7600169
2022/04/25
10.2K1
Antlr4实战:统一SQL路由多引擎
使用Calcite做Sql语法解析
Flink SQL中使用Calcite作为sql语法解析、校验、优化工具,本篇是实操篇,介绍一下calcite做sql语法解析使用方式。
Flink实战剖析
2022/04/18
3.3K0
Apache Calcite 论文学习笔记
特别声明:本文来源于掘金,“预留”发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a07eea32a6ff)
叁金
2019/07/22
1.5K0
Flink 自定义SQL实现Hudi MOR表压缩
Hudi在构建流式数据湖方面具有领先地位。Flink作为真正的流处理引擎,与Hudi搭配是理所应当的事情了。但是目前Hudi MOR表压缩功能除了在线压缩以外,并不能通过SQL实现手动压缩。目前的实现方式为:
从大数据到人工智能
2022/09/16
8370
Flink 自定义SQL实现Hudi MOR表压缩
相关推荐
flink sql 知其所以然(六)| flink sql 约会 calcite(看这篇就够了)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档