Catalyst揭秘 Day2 Catalyst源码初探

时间:2021-10-21 17:00:36

Catalyst揭秘 Day2

Catalyst源码初探

这节课从源码角度来讲catalyst。

首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高。因为除了指令执行性能以外,更重要的是架构层次,里面的核心是数据和代码的本地性问题。如果是能在内存中或者多线程运行,很多时候Java会比C语言性能高很多。

一般对rdd的操作都没有dataframe的快,主要就是catalyst这个执行优化器的作用。

SqlContext处理流程

写SparkSql的程序,有一个非常核心的东西,就是SQLContext。

SQLContext是基于SparkContext来构建的SQL和dataframe数据处理的上下文,会做一部分解析和驱动工作之后,还是会把执行以rdd的方式交给SparkContext来执行。

从源码的注释看,SQLContext是处理结构化数据的入口,允许我们创建dataframe,并可以基于dataframe进行sql查询。
Catalyst揭秘 Day2 Catalyst源码初探

首先,通过catalog,我们可以对plan进行初步处理,比如确定表名和表中的列名,生成Logical plan。

Catalyst揭秘 Day2 Catalyst源码初探

其内部核心是一个Hashmap,key是表名,value是LogicalPlan,主要提供了对表管理的一系列方法。
Catalyst揭秘 Day2 Catalyst源码初探

sqlParser负责对SQL语法进行分词,构建并返回一个语法树。
Catalyst揭秘 Day2 Catalyst源码初探

其中ParserDialect是核心,parse方法会负责具体的分词处理。
Catalyst揭秘 Day2 Catalyst源码初探

analyzer是真正的语法分析器,进行最原始的语法解析,变成logic plan。

Catalyst揭秘 Day2 Catalyst源码初探

Optimizer里面有一系列的优化规则,里面都是模式匹配,可以随意加规则,而且也不需要知道所有的东西。
Catalyst揭秘 Day2 Catalyst源码初探

SparkPlanner 优化物理执行计划,包含了一系列的优化策略,来优化我们物理执行的过程。
Catalyst揭秘 Day2 Catalyst源码初探

QueryExecution,是SQL执行执行上下文,负责生成结果。
Catalyst揭秘 Day2 Catalyst源码初探

QueryExecution中,会生成RDD。
Catalyst揭秘 Day2 Catalyst源码初探

至此,我们完整走了一遍流程,可以看到sql经过一系列处理后,生成了RDD,这个印证了昨天说的整个流程过程。

结果展现

那么这个生成的RDD后续会如何使用,我们简单的看一句SQL的结果展现:

从show方法开始:
Catalyst揭秘 Day2 Catalyst源码初探

show中会调用take方法,进而调用head方法。
Catalyst揭秘 Day2 Catalyst源码初探

head方法主要调用了collect方法。这里主要是对语句进行执行。
Catalyst揭秘 Day2 Catalyst源码初探

之后会执行SparkPlan中的execute方法生成RDD。
Catalyst揭秘 Day2 Catalyst源码初探

而其最终,会调用到RDD的collect方法,生成Job,进行运行。
Catalyst揭秘 Day2 Catalyst源码初探

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580