Spark Catalyst
创始人
2024-05-29 15:03:36
0

Spark Catalyst

  • 逻辑计划
    • 逻辑计划解析
    • 逻辑计划优化
    • Catalyst 规则优化过程
  • 物理计划
    • Spark Plan
      • JoinSelection
    • 生成 Physical Plan
      • EnsureRequirements

Spark SQL 端到端的优化流程:

  • Catalyst 优化器 : 包含逻辑优化/物理优化
  • Tungsten :

Spark SQL的优化过程 :

在这里插入图片描述

逻辑计划

val userFile: String = _
val usersDf = spark.read.parquet(userFile)val txFile: String = _
val txDf = spark.read.parquet(txFile)val users = usersDf.select("name", "age", "userId").filter($"age" < 30).filter($"gender".isin("M"))val result = txDF.select("price", "volume", "userId").join(users, Seq("userId"), "inner").groupBy(col("name"), col("age")).agg(sum(col("price") * col("volume")).alias("sum")result.write.parquet("_")

计算逻辑 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkAXwKmc-1678098435847)(../../png/Catalyst/image-20230213212938895.png)]

Catalyst 逻辑优化阶段:

  • 逻辑计划解析 : 把 Unresolved Logical Plan 换为 Analyzed Logical Plan
  • 逻辑计划优化 : 基于启发式规则(Heuristics Based Rules) ,把 Analyzed Logical Plan 转为 Optimized Logical Plan

Catalyst 逻辑优化阶段

在这里插入图片描述

Unresolved Logical Plan :

在这里插入图片描述

逻辑计划解析

逻辑计划解析 : 结合 DataFrame 的 Schema ,确认计划中的表名、字段名、字段类型和实际数据是否一致。确认后,就生成 Analyzed Logical Plan

Analyzed Logical Plan :

在这里插入图片描述

逻辑计划优化

同种计算逻辑的多种实现方式 :

  • 按照不同的顺序对算子做排列组合
  • 最好顺序:能省则省、能拖则拖的开发原则,选择所有实现方式中最优

在这里插入图片描述

Catalyst 优化规则范畴 :

  • 谓词下推(Predicate Pushdown):把谓词 (过滤条件 age < 30) 推到离数据源最近
  • 列剪裁(Column Pruning): 只扫描与查询相关的字段
  • 常量替换 (Constant Folding): 如 :age <12 + 18 优化成 age < 30

Cache Manager 优化 :

  • Cache Manager :维护与缓存相关信息。即:维护 Mapping 映射字典,Key :逻辑计划,Value :对应的 Cache 元信息
  • 当 Catalyst 进行逻辑计划优化时,先在 Cache Manager 查找,当该逻辑计划分支在 Cache Manager 时,就进行替换该计划

Optimized Logical Plan :

在这里插入图片描述

Catalyst 规则优化过程

逻辑计划(Logical Plan),物理计划(Physical Plan)都继承 QueryPlan

QueryPlan 父类: TreeNode

  • TreeNode :语法树中对节点的抽象
  • TreeNode 有个字段 children ,类型是 Seq[TreeNode]
  • 利用 TreeNode 类型,能构建出树结构

TreeNode 定义了很多高阶函数,如:transformDown

  • transformDown 的形参: 各种优化规则,返回类型是 TreeNode
  • transformDown 是递归函数,先优化当前节点,再依次优化 children 中的子节点,直到整棵树的叶子节点

transformDown 类似转换过程:

//Expression的转换
import org.apache.spark.sql.catalyst.expressions._val myExpr: Expression = Multiply(Subtract(Literal(6), Literal(4)), Subtract(Literal(1), Literal(9)))val transformed: Expression = myExpr transformDown {// 二元操作符,转成加法操作case BinaryOperator(l, r) => Add(l, r)// 大于 5 ,转成 1case IntegerLiteral(i) if i > 5 => Literal(1)// 小于 5 ,转成转成 0case IntegerLiteral(i) if i < 5 => Literal(0)
}

转换过程意图:

在这里插入图片描述

物理计划

物理计划阶段(Physical Planning) :

  • 优化 Spark Plan :根据优化策略 (Strategies),把逻辑计划的关系操作符映射成物理操作符
  • 生成 Physical Plan :根据 Preparation Rules,对 Spark Plan 进行完善

在这里插入图片描述

Spark Plan

Spark Plan 优化策略 :

  • 基于模式匹配的偏函数(Partial Functions),把逻辑计划中的操作符平行映射为 Spark Plan 中的物理算子
类型优化策略含义&作用
通用BasicOperators逻辑到物理的基本映射:如Project/Filter/Sort
JoinSelection静态 Joln 策略选择
InMemoryScans缓存策略,对应逻辑优化阶段的 Cache Manager
Aggregation聚合策路
Window窗口计算策酪
SpecialLimits与 Limit 相关的优化策路
PythonEvalsPython UDF 优化策路
SparkScriptsTransformation 脚本优化策略
StreamingStatefulAggregationStrategy有状态的聚合策略
StreamingDeduplicationStrategy流处理中的去重策路
StreamingGlobalLimitStrategy流处理中的 Limit 处理策略
StreamingJoinStrategy流处理中的 Join 策略
StreamingRelationStrategy数据源读取策酪
FlatMapGroupsWithStateStrategy流处理中的 FlatMap 优化

JoinSelection

Catalyst 运行时的 Join 策略:

Join 策略执行效率排序含义
Broadcast Hash Join (BHJ)最优小表构建哈希表,把小表广播进行关联
Shuffle Sort Merge Join (SMJ)次优先 Shuffle , 再排序进行关联
Shuffle Hash Join (SHJ)次优先 Shuffle , 再构建哈希表进行关联
Broadcast Nested Loop Join (BNLJ)最差将小表广播进行关联
Shuffle Cartesian Product Join (CPJ)最差先 Shuffle 进行关联

数据分发与 Join 实现机制的组合 :

在这里插入图片描述

Join 策略的先决条件 :

  • 条件型 : 判决 5 大 Join 策略的先决条件
  • 指令型:开发者提供的 Join Hints

5 种 Join 策略的先决条件:

选择顺序Join 策略Join 类型表大小
等值 JoinInner Join不能 Full Outer Join能广播
1BHJ
2SMJ
3SHJ
4BNLJ
5CPJ

指令型信息: Join Hints,允许个人选择 Join 策略

  • 选择 SHJ :
val result = txDF.select("price", "volume", "userId").join(users.hint("shuffle_hash"), Seq("userId"), "inner").groupBy(col("name"), col("age")).agg(sum(col("price") * col("volume")).alias("revenue"))

Spark Plan :Join 策略是 SMJ

在这里插入图片描述

生成 Physical Plan

从 Spark Plan 到 Physical Plan 的转换,需要 Preparation Rules 规则

Preparation Rules :

Preparation Rules含义作用
EnsureRequirements确保每个操作符的输入要求,必要时添加 Shuffle/Sort为 Physical Plan 补充必要的操作,保证 Spark Plan 计划的每个步骤能够顺利执行
CollapseCodegenStagesTungsten 优化机制:全阶段代码生成(Whole Stage Code Generation)在同个 Stage 内部,尽可能地把所有操作和计算捏合成一个函数,提升计算效率
ReuseExchange内存或磁盘中的存储复用同样的执行计划能共享广播变量或 Shuffle 的中间结果,避免重复的 Shuffle 操作
ReuseSubquery子查询复用复用同样的查询结果,避免重复计算
PlanSubquery生成子查询对子查询应用 Preparation Rules
ExtractPythonUDFs提取 Python 的 UDF 函数把 Python UDF 分发到单独的 Python 进程

EnsureRequirements

EnsureRequirements (满足前提条件) : 对执行计划中的每个操作符节点,都有 4 个属性用来描述数据输入/ 输出的分布状态

操作符属性含义
outputPartitioning输出数据的分区规则
outputOrdering输出数据的排序规则
requireChildDistribution要求输入数据满足某种分区规则
requireChildOrdering要求输入数据满足某种排序规则

Project 不满足 SortMergeJoin 的 Requirements:

  • outputPartitioning 属性 :Unknow,未 Shuffle
  • outputOrdering 属性: None ,未排序

在这里插入图片描述

EnsureRequirements 规则添加 Exchange/Sort :

  • Exchange : Shuffle 操作,满足 SortMergeJoin 对数据分布的要求
  • Sort :排序,满足 SortMergeJoin 对数据有序的要求
  • 调用 Physical Plan 的 doExecute 方法,把结构化查询的计算结果,转换成
    RDD[InternalRow]
  • InternalRow :Tungsten 设计的定制化二进制数据结构
  • 调用 RDD[InternalRow] 上的 Action 算子,Spark 就触发 Physical Plan 执行

在这里插入图片描述

Physical Plan :

  • EnsureRequirements 在两个分支上添加 Exchange/Sort
  • *(数字) : * : WSCG,数字 : Stage 编号
  • 数字相同会 WSCG 合成

在这里插入图片描述

相关内容

热门资讯

中考超常发挥的方法(经典3篇... 中考超常发挥的方法 篇一中考是每个初中生都要经历的一场考试,考生们都希望能够在考试中发挥出自己的最佳...
多想为你唱首歌初二作文(精选... 多想为你唱首歌初二作文 篇一多想为你唱首歌初二作文我喜欢唱歌,音乐是我生活中不可或缺的一部分。每当我...
我的承诺的作文初二作文【精选... 我的承诺的作文初二作文 篇一我的承诺作为一名初二学生,我深知自己肩负着责任和使命。因此,我要立下承诺...
的树作文初二500字(精彩6... 的树作文初二500字 篇一我家的大树我家住在一个小村庄里,村子里有一棵高大的树,是我家的标志物。这棵...
描写风景的初二语文作文【经典... 描写风景的初二语文作文 篇一春天的花海春天来了,大自然万物复苏,草木绿了,花儿开了。我和家人来到了位...
站得更高,才能看得更远初二作... 站得更高,才能看得更远初二作文 篇一站得更高,才能看得更远站得更高,才能看得更远。这是一句深富哲理的...
回忆是阵阵花香初二作文(通用... 回忆是阵阵花香初二作文 篇一回忆是阵阵花香回忆是一种美好的感觉,它能让人在瞬间回到过去,重新体验那些...
为生命喝彩作文【优质3篇】 为生命喝彩作文 篇一生命是一种奇迹,是一种宝贵的礼物。我们每个人都应该为生命喝彩,珍惜每一天,充实每...
初二作文《大爱无声》(精彩6... 初二作文《大爱无声》 篇一大爱无声大爱无声,是一种默默奉献的精神,是一种无私无畏的情感,是一种不求回...
木雪作文800字初二【经典3... 木雪作文800字初二 篇一:我与大自然的邂逅初二的时候,我和我的同学们参加了一次户外拓展活动,这是我...
感动油然而生初二作文800字... 篇一:初二生活中的一次感动初二生活中的一次感动初二的生活,充满了各种各样的感动。令我最难以忘怀的一次...
初二作文400字记叙文地震了... 初二作文400字记叙文地震了 篇一地震的那一天,我正和家人在家里度过一个平静的晚上。突然,地面开始摇...
爱好难选择作文【经典3篇】 爱好难选择作文 篇一爱好是每个人个性的体现,也是人们生活中不可或缺的一部分。然而,当我们面临选择自己...
青春畅想曲初二作文500字【... 篇一:青春畅想曲初二作文500字 青春畅想曲初二作文500字 篇一 青春是一首美妙的曲子,它充满了激...
父亲的“雪花”初二作文【通用... 父亲的“雪花”初二作文 篇一父亲的“雪花”每年的冬天,当雪花纷纷扬扬地飘落时,我的父亲总会给我带来一...
眼里的风景初二作文(精选3篇... 眼里的风景初二作文 篇一眼里的风景初二的生活对我来说是全新的,充满了无限的可能性和机会。在这个年龄,...
那一刻我明白了初二作文500... 篇一:那一刻我明白了初二作文初二时,我经历了一次令我深刻铭记的经历,让我对作文有了全新的理解和认识。...
其实我很在乎你初二作文800... 篇一:其实我很在乎你初二作文800字我坐在教室的角落里,默默地看着你。你专注地写着作业,微笑着和同桌...
八年级我想让学习更有效率作文... 八年级我想让学习更有效率作文 篇一近年来,我逐渐认识到学习的重要性,但有时候学习效率并不高。为了改善...
我创造了快乐作文600初二【... 我创造了快乐作文600初二 篇一快乐是一种心情,也是一种态度。在我们的生活中,有很多事情可以让我们感...