一,基本介绍
一言不合就上图。
由上图可以看出Catalyst的作用尤为重要。MLPipelines Structured Streaming,GraphFrames都是基于DataFrame和DataSet,进而可使用Catalyst进行优化,Sparksql 直接可以使用Catalyst进行优化。我们也可以根据数据源的特点,自己实现自己的数据源输入和相关的谓词下推优化。
那么为啥大家都喜欢结构化的数据呢?
1,根据定义,结构将限制可以表达的内容。
2,在实践中,我们可以容纳绝大多数的计算。
3,限制可以表达的空间实现优化。
从表达上来看
从处理速度上来看
二,Catalyst如何工作
使用高级编程接口编写程序
-程序用于描述需要什么数据操作,而无需指定如何执行这些操作。
-获得一个优化器,自动找出执行用户程序中指定的数据操作的最有效的方案。
如下图:
组件介绍
1),Analysis(Rule Executor):
将一个Unresolved logical plan转化为一个Resolved logical plan。
Unresolved => Resolved :使用Caatalog 找到datasets或者columns的来源和columns的类型。
2),Logical Optimization(Rule Executor):
将一个Resolved Logical plan 转化为一个 Optimized Logical Plan。
3),Physical Planning(Strategies + Rule Executor):
将一个Optimized Logical Plan 转化为一个Pysical Plan。
举例说明
比如,select sum(v) from ( select t1.id,1+2+t1.value as v) from t1 join t2 where t1.id = t2.id and t2.id > 50 * 1000) tmp
1),表达式(expression):
表达式代表一个新的值,需要根据输入计算才能得到。如:1+2+t1.value
2),属性(Attribute):
一个dataset的列(t1.id)或者或者一个特殊操作产生的一个列(v)。
根据sql构建的树如下:
逻辑计划:
1),逻辑计划描述了数据集上的计算,而不定义如何进行计算。
2),Output:
输出一个属性列表,如:[id,v]
3),约束:
关于由该计划生成的行的一组不变量,如:t2.id > 50 * 1000
物理计划:
1),物理计划描述了关于如何进行计算的具体定义的数据集的计算。
,物理计划是可执行的
转换操作
1,不转换tree类型的转换(Transform 和 Rule Executor)
1),Expressing => Expression
2),Logical Plan => Logical Plan
3),Physical Plan => Physical Plan
2,从一种类型的树,转换为另一种类型的树
Logical Plan => Physical Plan
3,与用于实现单个规则的每个树相关联的函数。
4,每个转换都是一个部分函数(Partial Function)
5,部分函数(Partial Function):
部分函数指的是定义的是输入的子集。Case 语句决定了是否给定的输入定义了部分函数。
组合新的规则:
1),谓词下推
对于很多过滤条件呢,假如数据源支持,那么就可以直接将过滤下推到数据加载的过程中,减少加载到Spark的数据,进而实现优化。
2),常量聚合
常量的计算没必要每行都计算一次,再生成规则的时候就可以直接结算然后使用计算过的结果。
3),列裁剪
只从数据源加载我们需要的列,对于不相关的列不加载。
RuleExecutor
Catalyst会将规则分组,在达到稳定点之前会一直执行当前组的规则,fixed point的意思也就是在使用当前组的规则树不会再变化了。将规则运行到fixed point意味着每个规则可以简单的,但仍然最终对树有更大的全局影响。RuleExecutor可以将一棵树转化为另一棵树,通过使用在同个批次的rules。
从物理计划到逻辑计划
1),通过使用一些列的策略可以使逻辑计划转化为物理计划。
2),每个策略都是使用模式匹配将一个数转化为另一种数。
SparkPlanner
1),首先是使用策略将逻辑计划转化为物理计划
2),使用RuleExecutor将物理计划变为可执行
A),准备标量子查询。
B),确保输入行的要求。
两个字段都需要进行排序,假如其中一个列已经排序好了,那可以省略排序的步骤。如下图
C),使用物理优化器。
三,总结
本文主要是用图文结合的方式举例子说明了一个Catalyst优化一个Sql的过程。
本文主要是截取自YouTube视频:https://www.youtube.com/watch?v=GDeePbbCz2g&t=1563s
由于SparkSql ,ML pipeline,StructuredStreaming ,GraphFrame都是要直接或者间接的使用到Catalyst,所以深入了解Catalyst对我们利用数据源特征,设计好应用程序会有很大帮助。后面会从源码层面去解析,SparkSQL解Catalyst。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有