如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么。之前总结的已经写了传统数据库与Spark的sql解析之间的差别。那么我们下来直切主题~

  如今的Spark已经支持多种多样的数据源的查询与加载,兼容了Hive,可用JDBC的方式或者ODBC来连接Spark SQL。下图为官网给出的架构.那么sparkSql呢可以重用Hive本身提供的元数据仓库(MetaStore)HiveQL、以及用户自定义函数(UDF)序列化反序列化的工具(SerDes).

  下来我们来细化SparkContext,大的流程是这样的:

  1、SQL语句经过SqlParser解析成Unresolved LogicalPlan;

  2、使用analyzer结合数据字典(catalog)进行绑定,生成Resolved LogicalPlan;

  3、使用optimizerResolved LogicalPlan进行优化,生成Optimized LogicalPlan;

  4、使用SparkPlanLogicalPlan转换成PhysiclPlan;

  5、使用prepareForExceptionPhysicalPlan转换成可执行物理计划。

  6、使用execute()执行可执行物理计划,生成DataFrame.

  这些解析的过程,我们都可以通过监控页面观察的到。

  下来我们先从第一个Catalog开始,什么是Catalog?它是一个字典表,用于注册表,对标缓存后便于查询,源码如下:

  

  这个类呢,是个特质,定义了一些tableExistes:判断表是否存在啊,registerTable:注册表啊、unregisterAllTables:清除所有已经注册的表啊等等。在创建时,new的是SimpleCatalog实现类,这个类实现了Catalog中的所有接口,将表名logicalPlan一起放入table缓存,曾经的版本中呢,使用的是mutable.HashMap[String,LogicalPlan]。现在声明的是ConcurrentHashMap[String,LogicalPlan]

  然后呢,我们来看一下词法解析器Parser的实现。在原先的版本中,调用sql方法,返回的是SchemaRDD,现在的返回类型为DataFrame:

  

  你会发现,调用了parseSql,在解析完后返回的是一个物理计划。

  

  我们再深入parse方法,发现这里隐式调用了apply方法

  

  下来我们看一下,它的建表语句解析,你会发现其实它是解析了物理计划,然后模式匹配来创建表:

  

  最后调用了RefreshTable中的run方法:

  

  那么创建完表了,下来开始痛苦的sql解析。。。上传说中的操作符函数与解析的所有sql函数!

  

   

  一望拉不到底。。。这个Keyword其实是对sql语句进行了解析:

  

  然后拿一个select的sql语法解析为例,本质就是将sql语句的条件进行了匹配过滤筛选

  

  一个select的步骤包括,获取DISTINCT语句投影字段projection表relationswhere后的表达式group by后的表达式hiving后的表达式排序字段orderingLimit后的表达式。随之就进行匹配封装操作RDD,Filter、Aggregate、Project、Distinct、sort、Limit,最终形成一颗LogicalPlan的Tree.

  那么join操作,也包含了左外连接、全外连接、笛卡尔积等。

  

  好的,既然sql的执行计划解析完了,下来该对解析后的执行计划进行优化,刚才的解析过程将sql解析为了一个Unresolved LogicalPlan的一棵树。下来Analyzeroptimizer将会对LogicalPlan的这棵树加入各种分析和优化操作,比如列剪枝谓词下压啊。

  AnalyzerUnresolved LogicalPlan数据字典(catalog)进行绑定,生成resolved LogicalPlan.然后呢OptimizerResolved LogicalPlan进行优化,生成Optimized LogicalPlan.

  

  这里的useCachedData方法实际是用于将LogicalPlan的树段替换为缓存中的。具体过滤优化看不懂啊TAT 算了。。第一遍源码,讲究先全通一下吧。

  下来,一系列的解析啊、分析啊、优化啊操作过后,因为生成的逻辑执行计划无法被当做一般的job来处理,所以为了能够将逻辑执行计划按照其他job一样对待,需要将逻辑执行计划变为物理执行计划。

  

  如下图,你注意哦,配置文件中shufflePartition的个数就是从这里传进来的。

  

  

  这里面真正牛逼变态的是BasicOperators。它对最常用的SQL关键字都做了处理,每个处理的分支,都会调用planLater方法,planLater方法给child节点的LogicalPlan应用sparkPlanner,于是就差形成了迭代处理的过程。最终实现将整颗LogicalPlan树使用SparkPlanner来完成转换。最终执行物理计划。

  

  

参考文献:《深入理解Spark:核心思想与源码分析》

Spark之SQL解析(源码阅读十)相关推荐

  1. RedBase SQL解析源码分析

    @原创文章,转载请注明: 转载自 镜中影的技术博客 本文链接地址: RedBase SQL解析源码分析) URL:http://blog.csdn.net/linkpark1904/article/d ...

  2. OpenGauss SQL解析源码分析

    OpenGauss SQL解析源码分析 SQL 引擎简介: SQL引擎整个编译的过程如下图所示,在编译的过程中需要对输入的SQL语言进行词法分析.语法分析.语义分析,从而生成逻辑执行计划,逻辑执行计划 ...

  3. 开源数据库OpenGauss的SQL解析源码分析

    首发于:blog: openGauss official blog - Gitee.com 一.   OpenGauss数据库体系概述 openGauss是关系型数据库,采用客户端/服务器,单进程多线 ...

  4. 【参赛作品16】openGauss SQL解析源码分析

    作者:梅氵 SQL 引擎简介: SQL引擎整个编译的过程如下图所示,在编译的过程中需要对输入的SQL语言进行词法分析.语法分析.语义分析,从而生成逻辑执行计划,逻辑执行计划经过代数优化和代价优化之后, ...

  5. spark源码阅读总纲

    spark使用了这么长时间,对于driver.master.worker.BlockManage.RDD.DAGScheduler.TaskScheduler这些概念或多或少都了解一些,但是对于其任务 ...

  6. Spark源码阅读——任务提交过程

    2019独角兽企业重金招聘Python工程师标准>>> Spark 源码阅读--任务提交过程 当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者 ...

  7. TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现

    本文为 TiDB 源码阅读系列文章的第五篇,主要对 SQL Parser 功能的实现进行了讲解,内容来自社区小伙伴--马震(GitHub ID:mz1999 )的投稿. TiDB 源码阅读系列文章的撰 ...

  8. TiDB 源码阅读系列文章(十五)Sort Merge Join

    2019独角兽企业重金招聘Python工程师标准>>> 什么是 Sort Merge Join 在开始阅读源码之前, 我们来看看什么是 Sort Merge Join (SMJ),定 ...

  9. mybatis源码阅读(三):mybatis初始化(下)mapper解析

    转载自 mybatis源码阅读(三):mybatis初始化(下)mapper解析 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单. ...

最新文章

  1. 使用OpenCV进行图像全景拼接
  2. 中科院基因组所高远组诚聘生物信息学方向助理/副研及博士
  3. python遍历字典的四种方法
  4. linux C语言 socket编程教程(附两个例子)(socket教程)
  5. C语言实现最小堆minheap(附完整源码)
  6. 盘点 Python 高手都写不出来的几个错误
  7. 语言防止鼠标连点_全球化设计系列 | 多语言设计的“小锦囊”
  8. python编程入门指南-《中小学生Python编程入门指南》附录二
  9. Kernel: Do NOT use global variable as possible as you can 尽量不使用全局变量
  10. 小程序中间放大轮播图_微信小程序实现类3D轮播图
  11. 单片机项目开发设计 - 器件选型原则根据、常用单片机资源配置要点(GPIO、SPI、IIC、ADC)
  12. android ppt 自动播放视频,ppt如何循环播放,ppt如何添加视频设置自动播放(ppt转换成视频)...
  13. 软件自动升级解决方案(一)
  14. 软考(软件设计师)考点总结 --法律法规与知识产权
  15. 什么是uboot?uboot有什么用?
  16. judgement_mna_2016(32位fmt)
  17. html的介绍与示例
  18. 联通132通话详单查询 js滚动表头 原理分析
  19. 小风翻译助手v1.0.0官方版
  20. ❤️AI从入门到到精通❤️

热门文章

  1. 安装rabbitMQ
  2. 当前环境下 物联网的四大关键点
  3. DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定
  4. 将object类型参数值传递给ObjectDataSource
  5. Spring(07)——单例注入多例之lookup-method
  6. PHP5.2.3+apache2.2.4的最简单安装方法
  7. 将tomcat的session信息通过memcached实现共享
  8. Java中ArrayList remove会遇到的坑
  9. [20170420]关于延迟块清除3.txt
  10. ZooKeeper集群安装