这是我参与「第四届青训营 」笔记创作活动的第 1 天!
1、大数据体系:
One SQL rules big data all;
2、SQL处理流程:
graph LR
Parser --AST -->Analyzer --Logical Plan --> Optimizer -- Physical Plan--> Executor
Parser:
1、把文本变成抽像语法结构(string -> AST)
涉及两个阶段:
- 词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
所谓词法分析:对源程序字符串扫描分解,拆出一个一个的“词”,即token。是编译器中最底层的分析。
- 语法分析:将token组成AST结,然后组合成AST
所谓语法分析:根据语法规则,将“词”组成语法单位,即建立一个层次结构——语法树(AST)。是编译程序的核心部分。
2、实现:递归下降(Clickhouse)、Flex和Bison(PostgreSQL)、JavaCC(Flink)、AnTlr(Presto、Spark)
Analyser:
1、访问库/表元信息并且绑定
2、检验 SQL 合法性(检验一些数据形式是否合理,如是否存在、类型是否正确)
3、AST 转换成 Logical Plan(逻辑计划)
逻辑计划树(Logical Plan)
1、是有顺序地表现每一步计算操作的逻辑图
2、计算操作就是算子(Operator),在树中每一个节点就是一个算子
可以理解为将每种可能的计划步骤都表现出来,但每个步骤中并没有具体表现怎么实现的,所以表现在逻辑层面。
查询优化(Optimizer优化器)
1、SQL是一种声明式语言,只告诉数据库要做什么,不会说明怎么做。所以这里存在对怎么做才能正确执行命令,且代价最小
2、查询优化就是数据库的大脑,帮助数据库找出最优执行计划(正确且代价最小)
3、一般而言,越复杂的SQL就越体现出查询优化后程序的效率更高。与之前性能差别甚至达到成百上千倍
物理执行计划(Physical Plan)
优化器的输出是一个分布式物理执行计划,有着多个节点,可以拆分出来单独看(执行子计划树PlanFragment)
*拆分过程:
目标:最小化网络数据传输
-
利用数据的物理分布,数据亲和性
-
增加Shuffle算子(执行计划树会以Shuffle为边界拆分PlanFragment)
Executor
按照物理计划执行对数据的扫描和处理
-
单机并行:一对一(cache,SIMD,pipeline)
-
多机并行:一个子计划树对应多个实例
3、分布式系统中 Shuffle 实现方式
粗略的,我们可以将程序的执行分为三个环节
-
map 阶段负责读取和解析数据
-
shuffle 阶段负责把对应的数据分发给相应的 reducer
-
而 reduce 阶段则做汇总属于自己的数据并做最终业务逻辑处理。
总而言之,Shuffle 描述数据从 map task 输出到 reduce task 输入这一阶段。Shuffle 连接 map 与 reduce ,其性能直接影响整个程序性能和吞吐量。
整个 shuffle 阶段我们又拆分为两个步骤:
-
shuffle write :指 mapper 把处理好的数据写到本地磁盘,一般会以 reduce 好处理的形式组织。
-
shuffle read :指 reducer 把分散在各个 mapper 的数据读取到本地并合并(这里没有再细分 copy 等步骤)。
Hash Shuffle
由图可以看到 Shuffle write 将数据打散,shuffle read 将每个 reducer 的数据写在一起。所以自然会想到,为了存储数据,每个 maper 为每个 reducer 建立一个文件。这就是 Hash Shuffle。
优化:
Hash Shuffle 生成文件数相当于maper 和 reducer 数量之积。整体上看,大任务中有40k个 maper 和 40k 个reducer时,会产生16亿文件数。这对于所有机器磁盘和网络的压力都会变得巨大。必须要优化。
资源是有限的,可以采取有限的并发,与map数脱钩,一部分先跑起来,然后再跑另一部分,直到最后。我们可以叫他 Consolidated Hash Shuffle。
Sort Shuffle
虽然 Consolidated Hash Shuffle 有一定优化效果,但是当 reducer 数量一多文件数又会达到很大数量。于是,可以想到可以与 reducer 数脱钩,干脆将所有文件合并起来。
同时为了 Shuffle Read 阶段遍历效率,不可能采取 Hash Shuffle那样方法。参考数据库,使用索引。每个 reduce 都可能拉取很多 partition,所以索引最好以 partition 为单位。同时为将 partition 与数据对应,进行排序。即Sort Shuffle。
优化:
进一步的优化显然易见了,就是再加入并发 consolidated 机制,变成 Consolidated Sort Shuffle。
4、SQL 中 group-by 和 join 的执行方式
Join:
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
Group By
- 用于结合聚合函数,根据一个或多个列对结果集进行分组
- Group By后面的是分组依据
参考文献:
词法分析和语法分析 - 小白求学记 (5haogou.com)
漫谈分布式系统(17) -- 决战 Shuffle - 知乎 (zhihu.com)