这是我参与「第四届青训营 」笔记创作活动的第1天。
第一节课「SQL Optimizer 解析」的内容主要包含 4 个方面:大数据体系和 SQL、常见的查询优化器、查询优化器的社区开源实践、SQL 相关的前沿趋势。这篇文章为大数据体系和 SQL 的相关内容,包括大数据体系和 SQL 的处理流程。
大数据体系
- 基础设施:ECS、存储、VPC
- 存储系统:HDFS、HBase、NAS、Object Store、数据湖
- 资源调度:YARN、K8S
- 分析引擎:
- 批式分析:Spark、Hive、MapReduce
- 实时分析:Flink
- 交互分析:Presto、ClickHouse、Doris
- 消息队列:Kafka、Pulsar、NSQ
- 权限管控:Apache Ranger、GDPR
- 数据开发:Airflow、DAG
- 业务应用:BI 报表、数据挖掘、营销分析、精准推荐
SQL 的处理流程
-
Parser
- 把文本变成抽象语法树结构(AST)
- 词法分析:拆分字符串,提取关键字、字符串、数值等 token
- 语法分析:将 token 组装成 AST node, 最终得到 AST
-
Analyzer
- 检查并绑定 Database, Table, Column 等元信息
- SQL 的合法性检查,比如数据库、表和列名是否存在,列的数据类型是否正确,MIN, MAX, AVG 的输入是否是数值
- 将 AST 转换成逻辑计划树(AST -> Logical Plan)
-
Logical Plan
- 逻辑地描述 SQL 对应的分步骤计算操作
- 计算操作:算子,定义了对数据集合的计算操作(过滤,排序,聚合,连接)
-
查询优化
- SQL 是一种生命式语言,用户只描述做什么,没有告诉数据库怎么做
- 目标:找到一个正确的且执行代价最小的物理执行计划
- 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是 NP
- 一般 SQL 越复杂,join 的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍
-
Physical Plan
- 优化器的输出是一个分布式的物理执行计划
- 目标:在单机 Plan 的基础上最小化数据移动和最大化本地 Scan,生成 Plan Fragment Tree
- 一个 Plan Fragment 封装了在一台机器上对数据集的操作逻辑。每个 Plan Fragment 可以在每个 executor 节点生成 1 个或多个执行实例,不同执行实例处理不同的数据集,通过并发来提升查询性能。
- Plan 分布式化的方法是增加 shuffle 算子,执行计划树会以 shuffle 算子为边界拆分为Plan Fragment。
-
Executor
- Executor 按照物理执行计划扫描和处理数据,充分利用机器资源
- 单机并行:cache, pipeline, SIMD
- 多机并行:一个 fragment 对应多个实例
个人总结
之前学过数据库相关的课程所以对 SQL 的语法很了解,但是对 SQL 的处理流程完全不了解。第一节课的第一部分让我对大数据体系有了更全面的认识,对 SQL 的处理流程也有了更多了解。