这是我参与「第四届青训营 」笔记创作活动的的第1天
学习大数据课程的第一课,后面持续更新...
"One SQL rules data ALL."👌 课前预习:
🌸以下是课程内容的思维导图,本笔记用于知识点详解和课外补充。
大数据体系:
声明:参考字节跳动青训营PPT。--侵删
SQL
SQL成为了大数据主流的接口。 主要负责大数据框架中的分析引擎部分。
SQL主要流程
graph LR
SQL--String-->Parser --AST--> Analyzer--Logical Plan-->Optimizer--Physical Plan--> Executer
Parser
语法分析器,将输入字符串经过词法分析或语法分析,转换为抽象语法树AST(abstract syntax tree)。
graph LR
字符串 --词法分析--> token--语法分析-->AST
- 实现方式:
- 递归下降-->click house
- Flex Bison-->PostgreSQL
- JavaCC -->Flink
- Antlr --> Presto,Spark
Analyzer&Logical plan
-
logical plan (left-deep tree)
JOIN右边一定是一个SCAN表格类型
-
analyzer
- 合法性检查
- 检查并绑定元信息
- AST->Logical Plan
SQL查询优化
最复杂的部分,需要考虑边界case,以及是NP问题。 数据量很大,所以好的查询优化算法很重要。❗
phsical plan 和executer。
- 数据亲和性: 每个节点最好读本地,跨节点网络传输读取速度会慢。所以感知数据分布,使用物理分布。以实现最小化网络传输的目的.
- 执行:
- 单机并行
- 多机并行
shuffle算子:
graph LR
计划PLAN-->拆分成物理计划片段segment-->executer
查询优化器
Top-down
Bottom-up
RBO
特点
关系代数等价语义
启发式规则
访问表的元信息catalog,不访问表数据data
查询优化器学习资源:
论述:
- [1] The Volcano Optimizer Generator: Extensibility and Efficient Search
- [2] The Cascades Framework for Query Optimization
- [3] Orca: A Modular Query Optimizer Architecture for Big Data 课程涉及:
- [CMU学习资源](CMU 15-445/645 :: Intro to Database Systems (Fall 2021))
- [spark-CBO]Cost Based Optimizer in Apache Spark 2.2 - The Databricks Blog
- [经典论文]How Good Are Query Optimizers, Really?
关系代数:
关系代数的基本运算:这些运算的运算数是一个或两个关系,预算结果产生一个新的关系: union, intersection, selection, projection, Cartesian product 和rename
优化原则
- 优化前代码
SELECT pv.siteld, user.name
FROM pv JOIN user
ON pv.siteId = user.siteId AND pv.userId = user.id
WHERE user.siteld > 123;
-
列裁剪
-
谓词下推
4.传递闭包
5.Runtime Filter
CBO(cost-based bptimizer)
模型估计执行计划的代价,选择最小代价的执行计划.
算子代价:
CPU,内存,磁盘1/O,网络1/0等代价
- 算子输入数据的统计信息有关:输入、输出结果的行数,每行大小.
- 叶子算子Scan: 通过统计原始表数据得到
- 中间算子: 根据一定的推导规则,从下层算子的统计信息推导得到
- 具体的算子类型,以及算子的物理实现有关
例子:
算子类型和输入数据和物理实现???
流程:
graph LR
统计信息+推导规划 --> 计算算子代价 --> 计算执行计划代价-->执行计划枚举
统计信息:
-
原始表统计信息
-
推导统计信息
- 基数cardinality
- 选择率selectivity
-
收集方式:
- DDL
CREATE TABLE REGION( R_REGIONKEY INT NOT NULL, R_NAME CHAR(25)NOT NULL, R_COMMENT VARCHAR(152) )DUPLICATE KEY(R_REGIONKEY) DISTRIBUTED BY HASH(R_REGIONKEY)BUCKETS 1 PROPERTIES ("stats_columns"="R_NAME");- 手动执行,触发数据库收集
ANALYZE TABLE table_name COMPUTE STATSICS FOR COLUMNS column-name1, column-name2,- 动态采样
SELECT count(*) FROM table_name -
统计信息推导规则
假设列列独立,且单个列的值是服从均匀分布
执行计划枚举
贪心算法或者动态规划
例子:实现三个表JOIN,先分解为两个表JOIN,然后算法优化
SELECT*FROMR,S,T
WHERE R.a=S.a
AND S.b=T.b
两表JOIN:
- Hash
- SortMerge