这是我参与「第四届青训营」笔记创作活动的第 1 天。
大数据小白,在简单了解了关于大数据的SQL查询优化器后,查阅了相关知识,以及大数据的各个分析引擎和SQL之间的关系,并对相关概念做了梳理。
一、SQL优化器在大数据中的应用
1、批式分析
1.1 Spark(Apache Spark): 面向对象的函数式编程语言,能够像操作本地集合对象一样轻松操作分布式数据集。Spark提供了大量的库,如Spark SQL库,Spark SQL的DataFrame,让Spark具备了处理大规模结构化数据的能力,简化了数据库之间的转化方式,而且获得了更高的计算性能。
1.2 Hive: 基于Hadoop的数据仓库分析系统,提供丰富的SQL查询方式分析存储在Hadoop中的数据。它可将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容。
1.3 MR(MapReduce): 一种编程模型,用于大规模数据集的并行运算。MapReduce实现基本SQL操作的原理是:连接分为Map Join和Reduce Join两种,Map Join的思想是将join中的小表复制到各个节点上,并加载到内存中;大表分片,与小表完成连接操作。Reduce Join是将map端按照连接字段进行hash,reduce端完成连接操作。
2、实时分析
Flink(Apache Flink): 使用相对简单的编程模型,具有高吞吐、低延迟、高性能以及支持exactly-once语义的特性,在工业生产中较为出众。flink通过sql的表达式,可以完成流批的统一,即可以处理流任务,也可以处理批任务,减少开发成本。
3、交互分析
3.1 Presto: 开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。Presto的客户端将SQL命令发送给协调者coordinator,coordinator将SQL指令转化为Presto可识别的计算任务并将其分发给worker;worker来执行这个任务,每一个worker执行一部分任务。
3.2 ClickHouse: 开源,用于在线分析处理查询(OLAP)MPP架构的列式存储数据库,能够使用SQL查询实时生成分析数据报告。ClickHouse提高了数据的压缩比重,降低了查询延时等。
3.3 Doris(Apache Doris): 基于MPP架构的高性能、实时的分析型数据库,具有极速易用的特点,在极短的响应时间内可返回海量数据下的查询结果,可以支持高并发的点查询场和高吞吐的复杂分析场景。支持标准ANSI SQL语法,Doris还实现了MySQL协议兼容,用户可以通过各类客户端工具来访问Doris。
二、SQL的处理流程
SQL的处理流程分为4个部分,如下图:
graph TD
... --SQL--> Parser --AST--> Analyzer --Logical Plan--> Optimizer --Physical Plan--> Executor
2.1 Parser(解析器): 把SQL源码Parser(解析)成抽象语法树AST,通过树形数据结构记录源码的信息,对sql语句进行词法和语法的解析。
2.2 Analyzer(分析器): 将 Parser 未能 Resolved 的 Logical Plan 给 Resolved 掉,即利用 Catalog 信息将 Unresolved Logical Plan 解析成 Analyzed logical plan。
2.3 Optimizer(优化器): 利用一些 Rule (规则)将 Analyzed logical plan 解析成 Optimized Logical Plan。logical plan 不能被 Spark 执行,因而将 logical plan 转换成多个 physical plans,然后利用代价模型(cost model)选择最佳的 physical plan。
2.4 Executor(执行器):将最终得到的 physical plan 进行代码生成,提交代码去执行最终任务。
更加详细的内容以及相关代码可以参考文章:# 详解Spark SQL 底层实现原理(parser、analyzer、optimizer、physical plan)
三、查询优化器
3.1 RBO (Rule-based Optimizer): 常用规则包括谓词下推、列裁剪、常量替换、常量累加、传递闭包、实时过滤( Runtime Filter)等。
3.2 CBO (Cost-based Optimizations):核心思想是计算每个物理计划的代价,然后得到最优的物理计划,可用的方法包括动态规划、贪心算法等。