如何能更好的运用与监控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. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  2. Spark常用函数(源码阅读六)

    源码层面整理下我们常用的操作RDD数据处理与分析的函数,从而能更好的应用于工作中. 连接Hbase,读取hbase的过程,首先代码如下: def tableInitByTime(sc : SparkC ...

  3. SparkStreaming(源码阅读十二)

    要完整去学习spark源码是一件非常不容易的事情,但是咱可以积少成多嘛~那么,Spark Streaming是怎么搞的呢? 本质上,SparkStreaming接收实时输入数据流并将它们按批次划分,然 ...

  4. 《淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树》

    淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树   曾经的学渣 2014-06-05 18:38:00 浏览1455 云数据库Oceanbase   OceanBase是 ...

  5. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划

    淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...

  6. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

    body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为 ...

  7. spark源码阅读

    根据spark2.2的编译顺序来确定源码阅读顺序,只阅读核心的基本部分. 1.common目录 ①Tags②Sketch③Networking④Shuffle Streaming Service⑤Un ...

  8. Mybatis源码阅读-配置文件及映射文件解析

    Mybatis源码分析: 1.配置文件解析: 1.1源码阅读入口: org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(); 功能:解析全局配置文 ...

  9. Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. Java(三)

    任意整数求和: (1) import java.util.Scanner; public class sum { @SuppressWarnings("resource") pub ...

  2. 页面上常用的一些小功能--QQ、回到顶部

    1.QQ <script charset="utf-8" type="text/javascript" src="http://wpa.b.qq ...

  3. 第五章 搭建 S3C6.410 开发板的 测试环境

    一.简介: 对于嵌入式驱动开发者来说,你必须要了解什么是开发板:它与我们经常用的手机类似, 包含了显示屏. 键盘. Wi-Fi. 蓝牙等模块等,是开发者必备的硬件设备.但与手机不同的是:在开发板上安装 ...

  4. iOS--UIView和UIWindow用法

    基础 UI(user interface)是用户界面:iOS的应用是由各种各样的UI控件组成 UIWindow就是一个窗口,学的第一个基础类,就是一个容器,可以在容器上放不同的内容,每个app都需要借 ...

  5. Day22_IO第四天

    1.合并流(序列流)-) { //不断的在a.txt上读取字节 fos.write(b1); //将读到的字节写到c.txt上 } fis1.close(); //关闭字节输入流 FileInputS ...

  6. Easyui扩展icon下载

    链接:http://pan.baidu.com/s/1eS7bh0e 密码:owzp 来源:https://github.com/cjw0511/jquery-extensions

  7. null、undefined、false、0相等性比较

    之前在看<JavaScript权威指南>的时候看到三个相等性比较的式子: null == undefined ;// ==>true undefined == false;// == ...

  8. jsp按钮隐藏自动点击

    <%@ page language="java" import="java.util.*" pageEncoding="big5"%& ...

  9. 计算机启动boot

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 零.boot的含义 先问一个问题,"启动"用英语怎么说? 回答是boot.可是,boo ...

  10. Java中的抽象类

    含有抽象方法的类,抽象方法即用abstract修饰的方法,即父类只知道其子类应该含有该方法,但无法知道子类如何实现这些方法 抽象类限制规定子类必须实现某些方法,但不关注实现细节 抽象类中可以包含普通方 ...