这是我参与「第四届青训营」笔记创作活动的第1天。
大数据体系和SQL
大数据体系
SQL的处理流程
1. Parser: String -> Abstract Syntax Tree (AST)
- 词法分析(Lexical Analysis):拆分字符串成若干token
- 语法分析(Syntactic Analysis):上一步的token作为AST的节点,形成AST
实现:递归下降 (ClickHouse), Flex and Bison (PostgreSQL), JavaCC(Flink), Antlr (Presto, Spark)
2. Analyzer: AST -> Logical Plan
- 绑定库/表元信息
- 合理性判断(存在、数据类型等)
- 转换成逻辑计划(结果导向的计划,并不涉及实现的算法)
3. Optimizer: Logical Plan -> Physical Plan
- 目标:利用数据亲和性(数据的物理分布)最小化网格数据传输&&最大化Scan
- 方法:优化逻辑计划(增删改节点)并分段成segment子执行计划(具体任务和节点的对应)
- 子执行计划之间通过Shuffle算子连接
4. Executer: 执行Physical Plan
- 单机并行:错位实施(cache, pipline, SIMD)
- 多机并行:一个fragment对应多个实例,由多个节点同时进行(如上图)
常见的查询优化器
查询优化器分类
基于遍历顺序:
- Top-down Optimizer
- Bottom-up Optimizer
基于优化原理:
- Rule-Based Optimizer (RBO): 不涉及具体表数据,仅根据启发式规则(基于经验)对关系表达式进行等价重写
- Cost-Based Optimizer (CBO): 根据统计信息和代价模型选择cost最小的执行计划
RBO原理
- 基于关系代数(运算符、定律)进行等价变化
- 优化方向:I/O、网络、CPU和内存
- 优化规则:
- 列裁剪
- 谓词下推
- 传递闭包
- Runtime Filter (min-max, in-list, bloom filter)
- 评价:实现简单,但不一定最优
CBO原理
- 通过RBO得到所有等价执行计划,模型估算算子代价后,选择代价最小的执行计划
- 算子代价:
- 和算子的统计信息有关:如叶子算子Scan、中间算子
- 和具体的算子类型有关
(未完待续)