当前位置: 首页 > news >正文

Spark SQL Catalyst工作流程

我们写的SQL语句,会经过一个优化器 (Catalyst),转化为 RDD,交给集群执行。

而Catalyst在整个Spark 生态中的地位也是至关重要的。

SQL到RDD中间经过了一个Catalyst,它就是Spark SQL的核心,是针对Spark SQL语句执行过程中的查询优化框架,基于 Scala 函数式编程结构。
RDD的运行流程:RDD-> DAGScheduler -> TaskScheduler -> worker,任务会按照编写的代码运行,代码运行效率依赖于开发者的优化,开发者会在很大程度上影响运行效率。而SparkSQL的Dataset和SQL并不是直接生成计划交给集群执行,而是经过Catalyst 的优化器,这个优化器能够自动帮助开发者优化代码。
我们要了解Spark SQL的执行流程,那么理解 Catalyst 的工作流程是非常有必要的。

Catalyst 优化器工作流程图:

1、Parser 模块: 将SparkSql字符串解析为一个抽象语法树/AST。Parser模块目前都是使用第三方类库antlr 进行实现的。在这个过程中,会判断SQL语句是否符合规范,比如 select from where 等这些关键字是否写对。

2、Analyzer 模块: 该模块会遍历整个AST,并对AST上的每个节点进行数据类型绑定以及函数绑定,然后根据元数据信息 Catalog 对数据表中的字段进行解析。此过程就会判断SQL 语句的表名,字段名是否真的在元数据库里存在。元数据信息主要包括两部分:表的Scheme和基本函数信息。表的Scheme:包括表的基本定义(列名、数据类型)、表的数据格式(Json、Text)、表的物理位置等。基本函数: 主要指类信息。

3、Optimizer模块: 主要分为 RBO和CBO两种优化策略,其中 RBO(Rule-BasedOptimizer)是基于规则优化,CBO (Cost-Based Optimizer)是基于代价优化。常见的规则有:

i、谓词下推 Predicate Pushdown: 将过滤操作下推到join之前进行,之后再进行join 的时候,数据量显著减少,join 耗时降低。

比如:

select *
from table1 a 
join table2 b
on a.id=b.id 
where a.age>20 and b.cid=1

上面的语句会自动优化为如下所示:

select *
from(select * from table1 where age>20) al
join(select * from table2 where cid=1) b
on a.id=b.id

即在子查询阶段就提前将数据进行过滤,后期join的shuffle数据量就大大减少。

ii、列值裁剪 Column Pruning: 在谓词下推后,可以把表中没有用到的列裁剪掉,这一优化一方面大幅度减少了网络、内存的消耗,另一方面对于列式存储来说大大提高了扫描效率。

select a.name, a.age, b.cid
from(select * from table1 where age>20) a
join(select * from table2 where cid=1) b
on a.id=b.id

上面的语句会自动优化如下所示:

select a.name a.age, b.cid
from(select name,age,id from table1 where age>20) a
join(select id,cid from table2 where cid=1) b
on a.id=b.id

就是提前将需要的列查询出来,其他不需要的列裁剪掉。

iii、常量累加 Constant Folding: 比如计算x+(100+80)->x+180,虽然是一个很小的改动,但是意义巨大。如果没有进行优化的话,每一条结果都需要执行一次100+80的操作,然后再与结果相加。优化后就不需要再次执行100+80操作。

select 1+1 as id from table1

上面的语句会自动优化如下所示:

select 2 as id from table1

就是会提前将1+1计算成2,再赋给 id 列的每行,不用每次都计算一次1+1。

4、SparkPlanner模块: 将优化后的逻辑执行计划(OptimizedLogicalPlan)转换成physical plan (物理计划),也就是Spark 可以真正执行的计划。比如join 算子,Spark根据不同场景为该算子制定了不同的算法策略,有 BroadcastHashJoin、ShuffleHashJoin 以及 SortMergejoin 等,物理执行计划实际上就是在这些具体实现中挑选一个耗时最小的算法实现。 具体怎么挑选,下面简单说下:
SparkPlanner 对优化后的逻辑计划进行转换,是生成了多个可以执行的物理计划Physical Plan;接着CBO(基于代价优化)优化策略会根据 Cost Model 算出每个Physical Plan 的代价,并选取代价最小的 Physical Plan 作为最终的 Physical Plan。
CostModel 模块: 主要根据过去的性能统计数据,选择最佳的物理执行计划。这个过程的优化就是 CBO(基于代价优化)
备注:以上2、3、4步骤合起来,就是 Catalyst 优化器

5、执行物理计划: 最后依据最优的物理执行计划生成java字节码将SQL转化为 DAG以RDD形式进行操作。


文章为涤生大数据课程笔记

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何高效记录并整理编程学习笔记?
  • 【论文阅读】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
  • Apache SeaTunnel 2.3.5 Zeta-Server集群环境搭建与使用
  • 【安卓】调用摄像头和相册
  • Ubuntu18.04 配置EtherCAT主站IGH SOEM
  • css实现水滴效果图
  • MPU6050详细介绍
  • 初始化React Native项目
  • 独立开发者系列(42)——MYSQL语句使用和进阶
  • SQL Server 2022的游标
  • 20240813在荣品RK3588S-AHD开发板的预置Android13中挂载ext4格式的256GB的TF卡
  • 【智能家居设备集成】智能家居设备的集成与互联互通
  • Revit二次开发_使用InnoSetup打包插件
  • Vue2.0 项目实战篇\部署篇
  • B3-111-A 小型挂轨式巡检机器人:智能巡检的突破之
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Centos6.8 使用rpm安装mysql5.7
  • GraphQL学习过程应该是这样的
  • js操作时间(持续更新)
  • Laravel5.4 Queues队列学习
  • Vue 2.3、2.4 知识点小结
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 创建一个Struts2项目maven 方式
  • 电商搜索引擎的架构设计和性能优化
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 计算机在识别图像时“看到”了什么?
  • 山寨一个 Promise
  • 使用common-codec进行md5加密
  • 微信小程序设置上一页数据
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我这样减少了26.5M Java内存!
  • 新手搭建网站的主要流程
  • 怎么将电脑中的声音录制成WAV格式
  • 找一份好的前端工作,起点很重要
  • 移动端高清、多屏适配方案
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #### go map 底层结构 ####
  • #stm32整理(一)flash读写
  • #window11设置系统变量#
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)无线电失控保护(二)
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (补充)IDEA项目结构
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (七)glDrawArry绘制
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)创业家杂志:UCWEB天使第一步
  • (转)真正的中国天气api接口xml,json(求加精) ...