Catalyst揭秘 Day2 Catalyst源码初探

Catalyst揭秘 Day2

Catalyst源码初探

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

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

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

SqlContext处理流程

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

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

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

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

Snip20160722_105

其内部核心是一个Hashmap,key是表名,value是LogicalPlan,主要提供了对表管理的一系列方法。
Snip20160722_106

sqlParser负责对SQL语法进行分词,构建并返回一个语法树。
Snip20160722_107

其中ParserDialect是核心,parse方法会负责具体的分词处理。
Snip20160722_108

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

Snip20160722_109

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

SparkPlanner 优化物理执行计划,包含了一系列的优化策略,来优化我们物理执行的过程。
Snip20160722_113

QueryExecution,是SQL执行执行上下文,负责生成结果。
Snip20160722_115

QueryExecution中,会生成RDD。
Snip20160722_116

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

结果展现

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

从show方法开始:
Snip20160722_117

show中会调用take方法,进而调用head方法。
Snip20160722_118

head方法主要调用了collect方法。这里主要是对语句进行执行。
Snip20160722_119

之后会执行SparkPlan中的execute方法生成RDD。
Snip20160722_122

而其最终,会调用到RDD的collect方法,生成Job,进行运行。
Snip20160722_121

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

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

原文地址:https://www.cnblogs.com/dt-zhw/p/5696927.html