第7章 Spark SQL 的运行原理(了解)

7.1 Spark SQL运行架构

  Spark SQL对SQL语句的处理和关系型数据库类似,即词法/语法解析、绑定、优化、执行。Spark SQL会先将SQL语句解析成一棵树,然后使用规则(Rule)对Tree进行绑定、优化等处理过程。Spark SQL由Core、Catalyst、Hive、Hive-ThriftServer四部分构成:

  Core: 负责处理数据的输入和输出,如获取数据,查询结果输出成DataFrame等

  Catalyst: 负责处理整个查询过程,包括解析、绑定、优化等

  Hive: 负责对Hive数据进行处理

  Hive-ThriftServer: 主要用于对hive的访问

7.1.1 TreeNode

  逻辑计划、表达式等都可以用tree来表示,它只是在内存中维护,并不会进行磁盘的持久化,分析器和优化器对树的修改只是替换已有节点。

  TreeNode有2个直接子类,QueryPlan和Expression。QueryPlam下又有LogicalPlan和SparkPlan. Expression是表达式体系,不需要执行引擎计算而是可以直接处理或者计算的节点,包括投影操作,操作符运算

7.1.2 Rule & RuleExecutor

  Rule就是指对逻辑计划要应用的规则,以到达绑定和优化。他的实现类就是RuleExecutor。优化器和分析器都需要继承RuleExecutor。每一个子类中都会定义Batch、Once、FixPoint. 其中每一个Batch代表着一套规则,Once表示对树进行一次操作,FixPoint表示对树进行多次的迭代操作。RuleExecutor内部提供一个Seq[Batch]属性,里面定义的是RuleExecutor的处理逻辑,具体的处理逻辑由具体的Rule子类实现。

整个流程架构图:

7.2 Spark SQL运行原理

7.2.1 使用SessionCatalog保存元数据

  在解析SQL语句之前,会创建SparkSession,或者如果是2.0之前的版本初始化SQLContext,SparkSession只是封装了SparkContext和SQLContext的创建而已。会把元数据保存在SessionCatalog中,涉及到表名,字段名称和字段类型。创建临时表或者视图,其实就会往SessionCatalog注册

7.2.2 解析SQL,使用ANTLR生成未绑定的逻辑计划

  当调用SparkSession的sql或者SQLContext的sql方法,我们以2.0为准,就会使用SparkSqlParser进行解析SQL. 使用的ANTLR进行词法解析和语法解析。它分为2个步骤来生成Unresolved LogicalPlan:

  # 词法分析:Lexical Analysis,负责将token分组成符号类

  # 构建一个分析树或者语法树AST

7.2.3 使用分析器Analyzer绑定逻辑计划

  在该阶段,Analyzer会使用Analyzer Rules,并结合SessionCatalog,对未绑定的逻辑计划进行解析,生成已绑定的逻辑计划。

7.2.3 使用优化器Optimizer优化逻辑计划

  优化器也是会定义一套Rules,利用这些Rule对逻辑计划和Exepression进行迭代处理,从而使得树的节点进行和并和优化

7.2.4 使用SparkPlanner生成物理计划

  SparkSpanner使用Planning Strategies,对优化后的逻辑计划进行转换,生成可以执行的物理计划SparkPlan.

7.2.5 使用QueryExecution执行物理计划

  此时调用SparkPlan的execute方法,底层其实已经再触发JOB了,然后返回RDD

最新文章

  1. Linux下面安装rpm包
  2. git相关资料
  3. c++builder XE8 线程 Thread
  4. ENVI/IDL中.sav和.pro文件用法的不同
  5. ACM——五位以内的对称素数
  6. HW2.10
  7. Action中取得request,session的四种方式
  8. 祭奠一年前写 Direct2D demo
  9. Android的init过程详解(一)(转)
  10. 【Web探索之旅】第四部分:Web程序员
  11. linux的学习系列 7---管道和过滤器
  12. Nuget 多平台多目标快速自动打包
  13. hiho 1097 最小生成树一·Prim算法 (最小生成树)
  14. Luogu P2661 [NOIP2015] 信息传递
  15. java 2D图形绘制
  16. 【巷子】---flux---【react】
  17. maven项目无法读取src/main/java目录下的配置文件解决方法
  18. PULL解析学习
  19. EF增删查改基类
  20. hdu1874 畅通project续(求最短路径)

热门文章

  1. Day06_商品分类(vuetify-nginx-cors)与品牌查询
  2. 读取 csv , xlsx 表格并添加总分列
  3. Linux最常用的基本操作复习
  4. PHP unserialize() 函数
  5. JavaScript正则表达式相关方法
  6. C/C++编程笔记:C++入门知识丨从结构到类的演变
  7. 7.1 NOI模拟赛 凸包套凸包 floyd 计算几何
  8. springboot 使用mybatis-generator自动生成代码
  9. 当你的系统依赖于某个bug...
  10. Vue组件通信之父传子