大数据体系和SQL | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第1天
大数据体系中的SQL——One SQL rules big data all
-
消息队列——解耦存储和计算
-
重点——分析引擎(SQL)
- SQL极为重视的原因:
- SQL简单便捷进行数据处理
- SQL有多种设备支持接口
- SQL用来处理大数据
SQL的处理流程
-
Parser
将SQL输入转化成AST输出
-
Analyzer
转化为Logical Plan,逻辑计划
-
Optimizer
输出物理计划
-
Executer
转发给客户
-
Parser
-
String -> AST (abstract syntax tree)(两个步骤)
- 词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
- 语法分析:将token 组成AST node,最终得到一个AST
-
实现:递归下降(ClickHouse),Flex和Bison (PostgreSQL),JavaCC(Flink),AntIr (Presto, Spark)
-
举例:
- AST一个树,由根节点拓展
-
-
Analyzer和Logical Plan
-
Analyzer(输入是一个抽象语法,输出是一个逻辑执行计划)
- 检查并绑定Database, Table,Column等元信息
- SQL的合法性检查,比如min/max/avg的输入是数值
- AST -> Logical Plan
-
Logical Plan(逻辑的一个描述SQL是如何一步步的执行查询和计算的,最终得到执行结果——一个分步骤的一个计算操作)
-
逻辑地描述SQL对应的分步骤计算操作计算操作(即只描述一个逻辑的过程,而不会去介绍这个操作的实现过程)
-
算子(operator)(这个数中的每个节点它都是一个算子,然后它定义了数据集合的计算,比如说像过滤排序等,边就代表数据的流向)
-
-
对于上图的流程来说:从下往上看,三个SCAN算子(读取作用)读取最下层的三张表——由JOIN算子(连接作用)根据某个条件去连接——AGGREGATE算子(聚合作用)起到求和的效果。——Top-N算子。
-
这类的树(left-deep-tree)都有一个共性:即JOIN的右子树都是一个SCAN算子,即都是一个表
-
-
-
查询优化
- SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做。
- 目标:找到一个正确且执行代价最小的物理执行计划
- 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的(即没有一个确定的最优解)
- 一般SQL 越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍
-
Physical Plan和 Executor
-
Physical Plan:执行计划子树
-
目标:最小化网络数据传输
-
利用上数据的物理分布(数据亲和性)
- 数据亲和性——在分布式系统中,一张表的数据,会分布在多个节点上,每个节点存储一部分数据,于是在读取这张表之后,每个节点读的过程中,最好保证每个节点只读本地的,不要去读远程的那部分数据,因为远程读取会涉及到网络的开销,会导致接口运行比较慢。
-
增加Shuffle算子(一边发送,一边接收)
-
-
Executor
- 单机并行:cache,pipeline,SIMD
- 多机并行:一个fragment 对应多个实例
-
-
小结
- One SQL rules big data all
- SQL需要依次经过Parser,Analyzer,Optimizer和 Executor的处理
- 查询优化器是数据库的大脑,在大数据场景下对查询性能至关重要
- 查询优化器需要感知数据分布,充分利用数据的亲和性
- 查询优化器按照最小化网络数据传输的目标把逻辑计划拆分成多个物理计划片段

浙公网安备 33010602011771号