🧠 Apache Calcite 详细介绍
一、什么是 Calcite?
Apache Calcite 是一个 动态数据管理框架,核心能力是:
🔥 SQL 解析 + 关系代数表示 + 查询优化 + 可插拔执行引擎适配
⚠ 注意:
Calcite 不是数据库 ,也不是计算引擎,它是一个:
-
SQL 解析器
-
关系代数转换器
-
查询优化器
-
多数据源联邦查询框架
二、为什么 Calcite 很重要?
在大数据生态里,几乎所有主流 SQL 引擎都用到了 Calcite 或借鉴了它的架构:
| 使用/集成 Calcite 的系统 |
|---|
| Apache Flink |
| Apache Hive |
| Apache Drill |
| Apache Druid |
| Apache Kylin |
| Trino(早期借鉴) |
👉 可以说:
Calcite 是大数据 SQL 优化领域的"编译器内核"
三、Calcite 整体架构
1️⃣ 总体流程
SQL
↓
Parser(语法解析)
↓
SqlNode
↓
RelNode(关系代数树)
↓
Optimizer(规则优化)
↓
执行计划(物理计划)
2️⃣ 核心模块说明
① SQL Parser
-
ANTLR 生成
-
支持 ANSI SQL
-
支持扩展函数
输出:SqlNode
② Validator(语义校验)
-
表是否存在
-
字段是否存在
-
类型是否匹配
-
函数是否合法
③ Relational Algebra(核心)
SQL 会被转换成关系代数树:
例如:
SELECT name FROM user WHERE age > 18
转换为:
Project(name)
Filter(age > 18)
TableScan(user)
这棵树就是 RelNode。
3️⃣ 优化器(最核心)
Calcite 最大价值在这里。
基于规则(Rule-Based Optimizer, RBO)
它通过:
-
Rule
-
Pattern Match
-
替换规则
不断改写 RelNode 树。
例如:
规则示例:
Filter(Project(x)) → Project(Filter(x))
可以减少扫描数据量。
Volcano 优化模型
Calcite 采用的是:
🔥 Volcano Optimizer Framework
特点:
-
支持成本模型(Cost-Based)
-
支持等价表达式搜索
-
支持多物理实现选择
四、Calcite 的"可插拔"能力
这是它最强大的地方。
1️⃣ 可插拔数据源(Adapter)
Calcite 支持多种数据源:
-
JDBC
-
MongoDB
-
Elasticsearch
-
Kafka
-
CSV
-
Hive
它可以:
把不同数据源统一抽象为 RelNode
实现:
🔥 联邦查询(Federated Query)
例如:
SELECT *
FROM mysql.user u
JOIN es.log l
ON u.id = l.user_id
Calcite 会拆分成:
-
一部分推给 MySQL
-
一部分推给 Elasticsearch
-
最后做 Join
五、核心概念详解
1️⃣ RelNode
所有查询最终变成:
-
LogicalProject
-
LogicalFilter
-
LogicalJoin
-
LogicalAggregate
-
LogicalTableScan
这是逻辑计划。
2️⃣ Convention
物理实现标识:
-
EnumerableConvention
-
JDBCConvention
-
FlinkConvention
优化时会选择不同物理实现。
3️⃣ Trait
用于表达:
-
排序
-
分布式属性
-
数据分布方式
用于优化器选择最优计划。
4️⃣ Cost Model
每个 RelNode 都有:
-
rowCount
-
cpu cost
-
io cost
优化器会选最低 cost 的计划。
六、在大数据中的作用
1️⃣ 在 Flink 中
Apache Flink 的 SQL 模块就是基于 Calcite。
Flink 做了:
-
自定义 Rule
-
自定义物理算子
-
自定义 cost model
2️⃣ 在 Hive 中
Hive 2.x 开始:
-
用 Calcite 替代原优化器
-
支持 CBO(Cost Based Optimization)
3️⃣ 在 Druid 中
Apache Druid 使用 Calcite 做 SQL 转换,然后转成 native JSON 查询。
七、典型执行流程(Flink 举例)
SQL
↓
Calcite Parser
↓
Logical Plan
↓
Rule 优化
↓
转换为 Flink Physical Plan
↓
生成 ExecutionGraph
↓
提交 JobManager
八、Calcite 的优势
✅ SQL 可扩展
✅ 优化规则可插拔
✅ 支持多数据源
✅ 支持 CBO
✅ 轻量级嵌入式框架
✅ 联邦查询能力强
九、Calcite 的局限
❌ 不负责执行
❌ 不负责存储
❌ 需要自己实现 Adapter
❌ 优化规则多时调试复杂
十、源码结构(核心包)
org.apache.calcite.sql // SQL 解析
org.apache.calcite.rel // 关系代数
org.apache.calcite.plan // 优化框架
org.apache.calcite.adapter // 数据源适配
org.apache.calcite.tools // 工具类
十一、一个简单代码示例
FrameworkConfig config = Frameworks.newConfigBuilder().build();
Planner planner = Frameworks.getPlanner(config);
SqlNode sqlNode = planner.parse("select * from user");
SqlNode validated = planner.validate(sqlNode);
RelNode relNode = planner.rel(validated).project();
这就是 SQL → RelNode 的过程。
十二、一句话总结
🔥 Calcite 是:
大数据 SQL 引擎的"编译器 + 优化器内核"
它解决的是:
-
SQL 如何变成关系代数?
-
如何做规则优化?
-
如何做成本优化?
-
如何适配不同存储引擎?