这是我参与「第四届青训营 」笔记创作活动的的第一天。
大数据体系与 SQL
大数据产品
阿里云
- 开源大数据平台 E-MapReduce,集成了常见的开源大数据计算和存储引擎如Spark、Flink等。
- 云原生大数据计算服务 MaxCompute
- 大数据开发治理平台 DataWorks
- Quick BI 数据可视化分析平台
腾讯云
- 云数据仓库
- 流计算 Oceanus 提供安全可靠的实时分析
- 数据集成 提供安全可靠的弹性计算服务
Google Cloud
- Compute Engine 创建和部署可扩缩的高性能虚拟机
- Cloud GPU 为您的工作负载添加 GPU,以助力机器学习、科学计算和 3D 可视化
- Google Kubernetes Engine (GKE) 以可靠、高效、安全的方式在 Kubernetes 上部署和扩缩容器化应用
- Batch on GKE 使用 Kubernetes 高效运行批量作业
- Cloud Bigtable Google 的全代管式 NoSQL 大数据数据库服务
大数据技术概览
流式计算 stream computing
特点:延时较低,动态数据
主要框架/技术: Apache Storm、Spark Streaming、Apache Flink等等。
应用场景:物联网、金融、实时推荐与内容优化等场景。
批式计算 batch computing
特点:延时较高,静态数据
主要框架/技术:主要框架 Spark,Apache Hadoop等等。
应用场景:数据分析、离线报表等场景。
交互分析引擎
以presto为例,Presto 是由 Facebook 开源的大数据分布式 SQL 查询引擎,适用于交互式分析查询。主要功能包括交互式分析、批量ETL(Extract-Transform-Load)等。
主要应用场景:
- ad-hoc查询
- BI报表引擎
- Hive SQL查询加速
YARN
YARN是Hadoop的子项目,是一个集群资源管理系统。 YARN向上层提供请求和使用集群资源的API,经过封装后使得MapReduce、Spark等应用可方便地申请和使用集群资源,并根据业务的变化进行调整。
Kubernetes
Kubernetes是一个工业级的容器编排平台,主要功能如下:
- 容器编排和集群调度
- 集群管理,如安全防护、准入机制和负载均衡等。
- 快速部署和扩展应用。
关系代数
关系代数是研究关系数据语言的数学工具
基本运算:选择、投影、并、差、笛卡尔积,更名,它们在SQL语言中均有体现。
| 关系代数运算及符号 | 关系代数表示 | SQL语句 |
|---|---|---|
| 投影 | SELECT name FROM students; | |
| 选择 | SELECT name FROM students WHERE class=1; | |
| 并 | SELECT name FROM students UNION SELECT name FROM teachers; | |
| 差 | SELECT name FROM students EXCEPT SELECT name FROM students WHERE class=1; | |
| 笛卡尔积 | SELECT * FROM students CROSS JOIN classes; | |
| 更名 | SELECT name FROM students AS studentnames; |
在关系代数中,由上述基本运算可得到许多附加运算,如集合交运算、连接运算等。
通过基于关系代数的等价变换,可以实现对SQL查询方案的优化。
编译原理
词法分析(Lexical Analysis):词法分析器读入SQL语句的字符流,按照一定的规则将其解析为词素的序列,输出每个词素的词法单元(token)。
语法分析(Syntactic Analysis):在词法分析的基础上检查语句是否复合语法逻辑并依据token来创建语句在编译过程中的中间表示——抽象语法树。
抽象语法树(Abstract Syntax Tree,AST):AST作为编译过程中的中间表示,由语法分析器创建,为下一步进行语义分析做准备。
语义分析(semantic Analysis):由抽象语法树进行基本的类型检查与转换后得到一个SQL语句的执行方案,指导执行算子进行查询等工作。
SQL的执行过程
逻辑计划、物理计划和分布式执行计划
逻辑计划是SQL语句通过SQL解析之后由各个逻辑算子组成的树状结构。
一个逻辑算子可能对应多个物理算子,如JOIN算子可对应MergeSort JOIN或Hash JOIN等。
物理计划是通过之前产生的逻辑计划生成的,其主要过程是按照拓扑序去遍历逻辑查询计划上的每一个逻辑算子,生成物理算子,得到物理计划。
分布式执行计划: 将查询计划分割成可在不同节点上执行的子任务,达到提高查询效率、减少网络数据传输的目的。
shuffle 的实现
shuffle分为Map shuffle和reduce shuffle两个阶段。Map shuffle主要由Partition,Collector,Sort,Spill,Merge等过程构成。reduce shuffle由Copy,SortMergr等过程构成。
shuffle 的主要目的是对map的结果进行分割,便于reduce并行地处理。在shuffle过程中,计算结果会被持久化到外部存储,也便于进行错误恢复。
SQL 查询优化
主要思想
SQL语句经历如上文所述的编译过程后,得到的执行方案不一定是最优的。SQL optimizer通过对执行方案的分析和优化,达到了降低成本提高效率的目的。SQL优化的本质是通过关系代数进行局部的等价变换从而使得语句更加简单高效。
常见方式:列裁剪、投影消除、谓词下推、最大最小消除、常量传播
常见查询优化器
Bottom-up Optimizer
从底层的节点开始不断地应用规则进行优化,一个节点开始优化时,其子树已完成优化。
问题
- 不方便进行剪枝操作
- 难以限制优化层数
Top-down Optimizer
对每棵子树不断应用规则,出现更优的结构后优化该子树及依赖该子树的所有树的最优成本。
问题
- 实现较为复杂
- 操作较繁琐
RBO
优点
- 速度较快 缺点
- 基于经验规则,无法保证方案最优
CBO
优点
- 优化效果好 缺点
- 需要不断地进行信息统计和成本计算
查询优化器的社区实践
Apache Calcite Calcite是对Volcano/Cascade 框架的一个开源实现。
Volcano/Cascade 框架 该框架属于基于成本的优化算法,通过自顶向下应用规则以及启发式算法获得更优的方案,并支持限制迭代次数、优化程度和规则穷尽等方式结束优化。
SQL 的前沿趋势
- 存储计算分离 便于系统的扩展和数据的迁移
- 云原生