Catalyst揭秘 Day2
Catalyst源码初探
这节课从源码角度来讲catalyst。
首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高。因为除了指令执行性能以外,更重要的是架构层次,里面的核心是数据和代码的本地性问题。如果是能在内存中或者多线程运行,很多时候Java会比C语言性能高很多。
一般对rdd的操作都没有dataframe的快,主要就是catalyst这个执行优化器的作用。
SqlContext处理流程
写SparkSql的程序,有一个非常核心的东西,就是SQLContext。
SQLContext是基于SparkContext来构建的SQL和dataframe数据处理的上下文,会做一部分解析和驱动工作之后,还是会把执行以rdd的方式交给SparkContext来执行。
从源码的注释看,SQLContext是处理结构化数据的入口,允许我们创建dataframe,并可以基于dataframe进行sql查询。
首先,通过catalog,我们可以对plan进行初步处理,比如确定表名和表中的列名,生成Logical plan。
其内部核心是一个Hashmap,key是表名,value是LogicalPlan,主要提供了对表管理的一系列方法。
sqlParser负责对SQL语法进行分词,构建并返回一个语法树。
其中ParserDialect是核心,parse方法会负责具体的分词处理。
analyzer是真正的语法分析器,进行最原始的语法解析,变成logic plan。
Optimizer里面有一系列的优化规则,里面都是模式匹配,可以随意加规则,而且也不需要知道所有的东西。
SparkPlanner 优化物理执行计划,包含了一系列的优化策略,来优化我们物理执行的过程。
QueryExecution,是SQL执行执行上下文,负责生成结果。
QueryExecution中,会生成RDD。
至此,我们完整走了一遍流程,可以看到sql经过一系列处理后,生成了RDD,这个印证了昨天说的整个流程过程。
结果展现
那么这个生成的RDD后续会如何使用,我们简单的看一句SQL的结果展现:
从show方法开始:
show中会调用take方法,进而调用head方法。
head方法主要调用了collect方法。这里主要是对语句进行执行。
之后会执行SparkPlan中的execute方法生成RDD。
而其最终,会调用到RDD的collect方法,生成Job,进行运行。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580