• Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块
• 不包含数据存储、数据处理等功能
• 可以通过编写 Adaptor 来扩展功能,以支持不同的数据处理平台
• Flink SQL 使用并对其扩展以支持 SQL 语句的解析和验证
下图是一张官方提供的生态系统图,可以看到大名鼎鼎的 Hive、Flink、Druid 以及 Spark、ES 等都可以被纳入 Calcite 生态圈。
• Catalog – 定义元数据和命名空间,包含 Schema(库)、Table(表)、RelDataType(类型信息)
• SQL Parser – 将用户编写的 SQL 语句转为 SqlNode 构成的抽象语法树(AST)
• SQL Validator – 使用 Catalog 中的元数据检验上述 SqlNode AST 并生成 RelNode 组成的 AST
• Query Optimizer – 将 RelNode AST 转为逻辑计划,然后优化它,最终转为实际执行方案。以下是一些常见的优化规则(Rules):
整体而言,Calcite 处理流程整体可以分为 Parse(语法和语义解析,生成 SqlNode 树)、Validate(验证各对象是否已在 Catalog 中注册)、Optimize(优化、生成 RelNode 树以及物理执行计划)、Execute(具体执行)四个阶段。
Calcite 支持部分 SQL 流处理语句,也提供了对 Tumbling / Hopping / Sliding / Cascading 等类型 Window 的支持,而 Flink 则把 Window 分为 Tumbling、Sliding (Hopping in SQL)、Session、Global 等类型,与 Calcite 提供的并不完全一致。
目前 Calcite 流处理语句已实现对 SELECT, WHERE, GROUP BY, HAVING, UNION ALL, ORDER BY 以及 FLOOR, CEIL 函数的支持。
其他的操作例如 JOIN, LIMIT 等仍然不支持。具体情况参见 https://calcite.apache.org/docs/stream.html
下图是 Flink 系统结构,其中 Table API 与 SQL 模块以 Calcite 为核心,大量用到 Calcite 的各种类和方法。
下图是 Flink Table 模块的内部表示。
可以看到它以 Calcite Catalog 为核心,上面承载了 Table API 和 SQL API 两套表达方式,最后殊途同归,统一生成为 Calcite Logical Plan(SqlNode 树);随后验证、优化为 RelNode 树,最终通过 Rules(规则)和 Convention(转化特征)生成具体的 DataSet Plan(批处理)或 DataStream Plan(流处理),即 Flink 算子构成的处理逻辑。
下图是 SQL 和 Table API 两种表达形式的处理逻辑,上下两种是等价的:
总而言之,Table / SQL API 的编程框架如下:
1. 通过 TableEnvironment 配置 CalciteConfig 对象,自动设置 SQL & Table API 默认处理参数。
2. 使用 registerTableSource() 来将一个 TableSource 注册到 rootSchema. 后续可以通过 scan() 获取此 Table 并调用各种 Table API 进行处理。
3. 接下可以调用 sqlQuery() 和 sqlUpdate() 方法来使用 SQL 语句进行数据处理。
下面的案例展示了对一句 SQL 查询的中间和最终处理结果:
Stream Processing for Everyone with SQL and Apache Flink
Streaming SQL in Apache Flink, KSQL, and Stream Processing for Everyone
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。