你好,游客 登录
背景:
阅读新闻

SparkSql的Catalyst之图解简易版

[日期:2018-01-06] 来源:  作者:浪尖 [字体: ]

一,基本介绍

一言不合就上图。

由上图可以看出Catalyst的作用尤为重要。MLPipelines Structured StreamingGraphFrames都是基于DataFrameDataSet,进而可使用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

输出一个属性列表,如:[idv]

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 pipelineStructuredStreaming GraphFrame都是要直接或者间接的使用到Catalyst,所以深入了解Catalyst对我们利用数据源特征,设计好应用程序会有很大帮助。后面会从源码层面去解析,SparkSQLCatalyst

收藏 推荐 打印 | 阅读:
相关新闻