大数据体系和SQL|青训营笔记

152 阅读5分钟

image.png 这是我参与「第四届青训营 」笔记创作活动的第 1 天!

1、大数据体系:

image.png

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 阶段则做汇总属于自己的数据并做最终业务逻辑处理。

image.png

总而言之,Shuffle 描述数据从 map task 输出到 reduce task 输入这一阶段。Shuffle 连接 map 与 reduce ,其性能直接影响整个程序性能和吞吐量。

整个 shuffle 阶段我们又拆分为两个步骤:

  • shuffle write :指 mapper 把处理好的数据写到本地磁盘,一般会以 reduce 好处理的形式组织。

  • shuffle read :指 reducer 把分散在各个 mapper 的数据读取到本地并合并(这里没有再细分 copy 等步骤)。

image.png

Hash Shuffle

由图可以看到 Shuffle write 将数据打散,shuffle read 将每个 reducer 的数据写在一起。所以自然会想到,为了存储数据,每个 maper 为每个 reducer 建立一个文件。这就是 Hash Shuffle

优化:

Hash Shuffle 生成文件数相当于maper 和 reducer 数量之积。整体上看,大任务中有40k个 maper 和 40k 个reducer时,会产生16亿文件数。这对于所有机器磁盘和网络的压力都会变得巨大。必须要优化。

资源是有限的,可以采取有限的并发,与map数脱钩,一部分先跑起来,然后再跑另一部分,直到最后。我们可以叫他 Consolidated Hash Shuffle

image.png

Sort Shuffle

虽然 Consolidated Hash Shuffle 有一定优化效果,但是当 reducer 数量一多文件数又会达到很大数量。于是,可以想到可以与 reducer 数脱钩,干脆将所有文件合并起来。

同时为了 Shuffle Read 阶段遍历效率,不可能采取 Hash Shuffle那样方法。参考数据库,使用索引。每个 reduce 都可能拉取很多 partition,所以索引最好以 partition 为单位。同时为将 partition 与数据对应,进行排序。即Sort Shuffle

image.png

优化:

进一步的优化显然易见了,就是再加入并发 consolidated 机制,变成 Consolidated Sort Shuffle。

4、SQL 中 group-by 和 join 的执行方式

Join:

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

  • INNER JOIN:如果表中有至少一个匹配,则返回行 image.png
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 image.png
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 image.png
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

Group By

  • 用于结合聚合函数,根据一个或多个列对结果集进行分组
  • Group By后面的是分组依据

参考文献:

词法分析和语法分析 - 小白求学记 (5haogou.com)

(1条消息) Spark——Spark SQL逻辑计划(Logical Plan)、物理计划(Physical Plan)和Catalyst优化器(Catalyst Optimizer)_aof_的博客-CSDN博客_spark 逻辑计划

漫谈分布式系统(17) -- 决战 Shuffle - 知乎 (zhihu.com)

(1条消息) shuffle机制和原理分析_LYlinye的博客-CSDN博客_试分析shuffle过程的作用

(1条消息) SQL 中的 join 及group by_Gavin_周的博客-CSDN博客_join和groupby