这是我参与「第四届青训营 」笔记创作活动的的第1天
一、大数据体系
大数据体系主要分为七层,从下至上依次为:
1.基础设施,主要是ESC,存储,VPC,主要有日志查询管理组件。
2.存储设施,有HDFS,HBase,等自研的存储系统,有监控报警功能。
3.资源调度,有YARN,K8S,主要有用户管理功能。
4.分析引擎,主要分为三类,有批式分析,Spark,Hive,MR;有实时分析Flink;有交互分析Presto等。消息队列主要用Kafka等,主要用于存储的计算的解耦。主要功能是集群管理,服务管理。
5.权限管控,有Apache Ranger,GDPR,用来集群创建。
6.数据开发,主要有一个DAG任务流调度系统和Airflow,用来集群创建。
7.业务应用,有BI报表,数据挖掘,营销分析等,用来管控运维。
二、sql在分布式环境下的处理
sql的处理流程
sql 经过Parser 输出AST,再经过Analyzer 输出Logical Plan逻辑计划,在经过优化器Optimizer处理生成Physical Plan物理计划,交给executor处理数据,返回结果给用户。
1.Parser
- String->AST,输入字符串,输出抽象语法树。
词法分析:拆分字符串,得到关键词,数值常量,字符串常量,运算符号等token
语法分析:将token组成AST node,最后得到一个AST
- 实现:可以通过递归下降,开源工具Flex,Bison完成词法分析,语法分析,Flink中通过JAVACC实现等。
2.Analyzer
- Analyzer
检查并绑定Database,Table,Column等元信息是否存在合法
SQL的合法性检查,比如min/max/avg输入的是否是数值
AST->Logical Plan 输入抽象语法树,输出逻辑计划
- Logical Plan
逻辑地描述SQL对应的分步骤计算操作
计算操作:算子(树中的节点)
从这三张表scan读取数据,join连接算子,将表连接起来,进行聚合group-by,求和,最后TOP-N完成堆排。
- left-deep tree的特点,join的右边必须是一个表。
3.查询优化(重点)
- 目标:找到一个正确且执行代价最小的物理执行计划
- 一般sql越复杂,join的表越多,数据量越大,查询优化的意义就越大
对逻辑计划进行拆分为PlanFragment:执行计划子树
目标:最小化网络数据传输(尽量只读本地,远程会比较慢)
利用上数据的物理分布(数据亲和性)
增加shuffle算子,一边做发送一边做接收
4.Executor
单机并行:cache,pipeline,SIMD
多级并行:一个fragment对应多个实例
三、查询优化器的分类
1.遍历树的顺序划分
Top-down Optimizer(微软使用)
从目标输出开始,由上往下遍历计划书,找到完整的遍历计划树,找到完整的最优执行计划
例子:Volcano/Cascade,SQLSwrver
Bottom-up Optimizer
从零开始,由下往上便利计划数,找到完整的执行计划
例子:System R(最早的数据库优化器), postgreSQL,IBM DB2
2.优化方法划分
Rule-based Optimizer(RBO)
根据关系代数等价于语义,重写查询
基于启发式规则
会访问表的元信息(catalog),不会涉及具体的表数据(data)
Cost-based Optimizer(CBO)
使用一个模型估算执行计划的代价,选择代价最小的执行计划。
RBO介绍
RBO-关系代数
- 运算符:select,project,join,rename,union等
- 等价变换:结合律,交换律,传递性
RBO-优化原则
- I/O 读更少的数据,读数据更快
- Network 传输数据更少更快
- CPU&Memory cpu指令数更少,内存占用更少
RBO-列裁剪
从上到下检查需要哪些列,合并,到最后只需要scan只需要用到的列。
RBO-谓词下推
在SQL中,谓词是一些表达式,就是返回boolean值即true和false的函数,或是隐式转换为bool的函数。SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS。
谓词下推就是将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。
谓词下推适用情况详见该连接谓词下推简单总结
RBO-传递 闭包
推出 pv.siteld > 123
RBO-Runtime Filter
详细介绍见该链接查询性能优化之 Runtime Filter
RBO-小结
主流RBO实现一般都有几百条基于经验归纳得到的优化规则
- 优点:实现简单,优化速度快
- 缺点:不保证得到最优的执行计划
CBO介绍
CBO-概念
-使用一个模型估算执行计划的代价,选择代价最小的执行计划
执行计划的代价等于所有算子的执行代价之和
通过RBO得到(所有)可能的等价执行计划
- 算子代价:CPU,内存,磁盘I/O,网络I/O等代价
和算子输入数据的统计信息有关:算子的输入,输出结果的行数,每行大小
叶子算子Scan:通过统计原始表数据得到
中间算子:根据一定的推到规则,从下层算子的统计信息推导得到
和具体的算子类型,以及算子的物理实现有关
CBO-统计信息
- 原始表统计信息
表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等
列级别:min、max、num nulls、num not nulls、num distinct value等
- 推导统计信息
选择率:对于某一个过滤调价,查询会从表中返回多大比例的数据
基数:在查询计划中长治算子需要处理的行数
CBO-统计信息的收集方式
- 在DDL里致电给需要收集的统计信息,数据库会在数据写入时手机或者更新统计信息(缺点:影响实时导入插入速率)
- 手动执行 explain analyze statement,触发数据库手机或者更新统计信息(缺点:旧,已经插入没有及时更新)
- 动态采样
CBO-统计信息推导规则
假设列和列之间之间是独立的,列的值是均匀分布的
CBO-统计信息的问题
假设经常与现实不符。
一些列经常是有关联性的,通过用户指定或者数据库自动识别相关联的列进行特殊处理。
中国人口性别,年龄,数量并不均匀分布,使用直方图进行处理。
CBO-执行计划枚举
使用贪心算法或者动态规划选出最优的执行计划。
动态规划:
Hash Join 和SortMerge Join两种连接方式,选出最低cost,将问题扩大,再进行三表连接,分别求出两种连接方式的代价,保留最好的,选出总的最优执行计划。
CBO小结
- CBO使用代价模型和统计信息估算执行计划的代价
- CBO使用贪心活动态规划算法寻找最优执行计划
- 在大数据场景下CBO对查询性能非常重要
四、数据库以及优化器的前沿趋势
- 引擎架构的进化,存储计算分离;一体化(HTAP,HSAP,HTSAP)
- Cloud 云原生 severless
- 湖仓一体 Queery Federation
- DATA+AI
1.AI4DB
- 自配置
智能调参(OtterTune,QTune)
负载预测、调度
- 自诊断和自愈合:错误恢复和迁移
- 自优化:
统计信息估计
代价估计
学习应优化器
索引/试图推荐
2.DB4AI
- 内嵌人工智能算法(MLSQL,SQLFlow)
- 内嵌计息学习框架(SparkML,Alink,dl-on-flink)
总结
通过第一次课的学习主要了解了大数据体系,sql的处理流程以及数据库和优化器的前沿趋势,重点了解了查询优化器的分类。优化器的分类可以通过遍历树的顺序划分,也可以通过优化方法划分,主要了解了RBO和CBO两类优化器。RBO是根据经验所得的几百条优化规则,速度快,但可能具有不准确性,CBO主要使用代价模型估计,以及贪心或动态规划算法进行优化策略选择,市面上大多选择RBO和CBO结合使用,sql以及优化器的学习为以后的学习打下了基础。