时间:2021-07-01 10:21:17 帮助过:32人阅读
程序前两句1和2生成SQLContext,导入sqlContext下面的all,也就是运行SparkSQL的上下文环境。
程序3,4两句是加载数据源注册table
第6句是真正的入口,是sql函数,传入一句sql,先会返回一个SchemaRDD。这一步是lazy的,直到第七句的collect这个action执行时,sql才会执行。
SQLContext是执行SQL的上下文对象,首先来看一下它Hold的有哪些成员:
一个存储<tableName,logicalPlan>的map结构,查找关系的目录,注册表,注销表,查询表和逻辑计划关系的类。
Parse 传入的sql来对语法分词,构建语法树,返回一个logical plan
logical plan的语法分析器
logical Plan的优化器
逻辑计划,由catalyst的TreeNode组成,可以看到有3种语法树
包含不同策略的优化策略来优化物理执行计划
sql执行的环境上下文
就是这些对象组成了Spark SQL的运行时,看起来很酷,有静态的metadata存储,有分析器、优化器、逻辑计划、物理计划、执行运行时。
那这些对象是怎么相互协作来执行sql语句的呢?
话不多说,先上图,这个图我用一个在线作图工具process on话的,画的不好,图能达意就行:
核心组件都是绿色的方框,每一步流程的结果都是蓝色的框框,调用的方法是橙色的框框。
先概括一下,大致的执行流程是:
Parse SQL -> Analyze Logical Plan -> Optimize Logical Plan -> Generate Physical Plan -> Prepareed Spark Plan -> Execute SQL -> Generate RDD
更具体的执行流程:
sql or hql -> sql parser(parse)生成 unresolved logical plan -> analyzer(analysis)生成analyzed logical plan -> optimizer(optimize)optimized logical plan -> spark planner(use strategies to plan)生成physical plan -> 采用不同Strategies生成spark plan -> spark plan(prepare) prepared spark plan -> call toRDD(execute()函数调用) 执行sql生成RDD
回到开始的程序,我们调用sql函数,其实是SQLContext里的sql函数它的实现是new一个SchemaRDD,在生成的时候就调用parseSql方法了。
[java] view plain copy结果是会生成一个逻辑计划
[java] view plain copy当我们调用SchemaRDD里面的collect方法时,则会初始化QueryExecution,开始启动执行。
[java] view plain copy我们可以很清晰的看到执行步骤:
[java] view plain copy
至此整个流程结束。
通过分析SQLContext我们知道了Spark SQL都包含了哪些组件,SqlParser,Parser,Analyzer,Optimizer,LogicalPlan,SparkPlanner(包含Physical Plan),QueryExecution.
通过调试代码,知道了Spark SQL的执行流程:
sql or hql -> sql parser(parse)生成 unresolved logical plan -> analyzer(analysis)生成analyzed logical plan -> optimizer(optimize)optimized logical plan -> spark planner(use strategies to plan)生成physical plan -> 采用不同Strategies生成spark plan -> spark plan(prepare) prepared spark plan -> call toRDD(execute()函数调用) 执行sql生成RDD
随后还会对里面的每个组件对象进行研究,看看catalyst究竟做了哪些优化。
——EOF——
原创文章,转载请注明:
转载自:OopsOutOfMemory盛利的Blog,作者: OopsOutOfMemory
本文链接地址:http://blog.csdn.net/oopsoom/article/details/37658021
注:本文基于署名-非商业性使用-禁止演绎 2.5 中国大陆(CC BY-NC-ND 2.5 CN)协议,欢迎转载、转发和评论,但是请保留本文作者署名和文章链接。如若需要用于商业目的或者与授权方面的协商,请联系我。
转自:http://blog.csdn.net/oopsoom/article/details/37658021
第一篇:Spark SQL源码分析之核心流程
标签:好的 protected 注册 plain should and 语法 lan 执行计划