这是我参与「第四届青训营 」笔记创作活动的的第1天
一.大数据
-
什么是大数据
顾名思义,指的是大量的数据,这些数据通常是传统数据处理软件无法处理的
-
大数据的特征
- 大量(Volume):大数据的量很大,数据量通常可达数十TB甚至数百PB(PB = 1024TB)
- 高速(Velocity):大数据被实时的写入内存,同时基于数据实时评估而进行操作
- 多样化(Variety):数据类型不一,无法被整齐的写入关系型数据库中
- 价值(Value):将原始数据经过分析得到较高的商业价值
二.大数据体系
大数据的核心模块
- 存储系统:
- HDFS:Hadoop分布式文件系统
- HBase:基于Hadoop实现的分布式非关系型数据库
- NAS:网络附属存储,一种专用数据存储服务器
- Object Store:将数据作为对象进行管理的计算机数据存储体系结构
- 数据湖:存储所有的数据
- 分析引擎:
- 批式分析:Spark,Hive,MR
- 实时分析:Flink
- 交互分析:Presto,ClickHouse,Doris
- 消息队列:解耦存储和计算,常用Kafka
三.大数据体系和SQL
-
sql成为了大数据分析引擎的接口:one sql rules big data all
-
sql的处理流程
-
Parser:SQl > AST
将sql语句解析成为语法分析树
具体实现:递归下降,Flex和Bison,JavaCC,Antlr
-
Analyzer:AST > Logical Plan
-
Analyzer:检测SQL合法性
-
Logical Plan:描述SQL执行步骤
-
-
查询优化
-
SQL是一种声明式的语言,用户只描述做什么,没有描述怎么做
-
目标:找到一个正确且执行代价最小的物理计划
-
应用场景:SQL语句越复杂,Join表越多,数据量越大,查询优化意义越大
-
-
Physical Plan 和 Executor
-
Plan Fragment:执行计划子树
目的:最小化网络数据传输
增加shuffle算子:计算和传输
-
Executor
多机并行:一个fragment对应多个实例
-
-
-
小结:查询优化器是数据库的大脑,以按照最小化网络传输的目标去执行SQL语句
四.常见的查询优化器
-
查询优化器分类
-
Top-down Optimizer
从上往下遍历计划树,eg:Volcano/Cascade,SQLServer
-
Bottom-up Optimizer
从下往上遍历计划树,eg:PostgreSQL
-
Rule-Base Optimizer (RBO)
根据关系代数等价语义,重写查询
访问表的元信息,不涉及具体数据
-
Cost-Base Opyimizer(CBO)
使用一个模型评估执行计划的代价,选择代价最小的执行计划
-
-
RBO-关系代数
-
运算符:Select,Project,Join,Rename,Union
-
等价交换:结合律,交换律,传递性
-
优化方向:I/O,network,cpu&memory
-
优化规则
- 列裁剪:将不需要的列裁剪
- 谓词下推:将过滤条件下推
- 传递闭包:推导出新的过滤条件
- Runtime Filter:根据集合的范围创造新的过滤条件(min-max,in-list,bloom filter)
-
主流的RBO是基于经验归纳的优化规则
优点:实现简单,优化速度快
缺点:不能保证得到最优的执行计划,不适和多表连接
-
-
CBO
-
执行代价 = 所有算子代价和
通过RBO得到所有可能的等价执行计划
-
算子代价:CPU,内存,磁盘I/O,网络I/O等
和算子的输入以及类型有关
-
统计信息
-
原始表统计信息
- 表级,行数,行平均大小,占字节数
- 列级,min,max,num nulls,num not nulls
-
推导统计信息
- 选择率:对于一个过滤条件返回比例数据
- 基数:在查询计划中常指算自需要处理的行数
-
准确的统计信息比代价模型本身更重要
-
-
统计信息的收集方式
-
在DDL中指定需要收集的统计信息,在数据库写入时更新:影响写入速率
-
手动执行触发数据库收集信息
ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS FOR COLUMNS COLUMN_NAME1,... -
动态采样
select count(*) from table_name
-
-
统计信息推导规则
-
and:fs(a&b) = fs(a) * fs(b)
-
or:fs(a|b) = fs(a) + fs(b) - fs(a&b)
-
not:fs(!a) = 1- fs(a)
-
等于 x = Iiteral:Iiteral < min || literal > max == 0
1/NAD (均匀分别)
-
小于 x < Iiteral:Iiteral < min == 0
Iiteral > max == 1
(Iiteral - min)/(max - min)
-
-
统计信息的问题
- 列和列有关联
- 列不是均匀分布
-
执行计划枚举
- 通常使用贪心算法或者动态规划选出最佳执行计划
-
CBS效果
- 通常情况下RBO已经能提供较好的查询效率
-
五.apache calcite
-
apache calcite
- 统一的sql查询引擎
- 模块化,插件化
- 支持异构模型
- 内置RBO,CBO
-
RBO-HepPlanner
- 优化规则:匹配子树,等价代换得到新的表达式
- 内置优化规则,然后遍历所有规则
-
CBO-VolcanoPlanner
-
基于Volcano/Cascade框架
-
成本最优假设
-
Memo:存储候选计划
Group:等价计划集合
-
Top-Down动态规划搜索
-
-
六.前沿趋势
- 存储计算分离:解耦存储和计算
- 云原生:依赖存储计算分离,K8S,根据负载分配计算节点
- 湖仓一体:保存原始数据,将数仓和数湖的优点结合
- DATA+AI
- AI4DB
- 自配置:智能调参(QtterTune,QTune),负载预测、调度
- 自诊断自愈合:错误恢复和迁移
- 自优化:统计信息,代价估计,学习型优化器(IBM,DB2,LEO),索引视图推荐
- DB4AI
- 内嵌人工智能算法(MLSQL,SQLFlow)
- 内嵌机械学习框架(SparkML,Alink,dl-on-flink)
- AI4DB
七.总结
由于sql的便利性,大数据引擎都提供了sql接口,但是sql只是一种声明性语言,所以要优化执行sql的过程,sql的优化器有RBO和CBO,RBO是根据代数关系的优化,由于RBO的优化路径不止一种,所以需要通过CBO选择最优的RBO路径执行