spark1.x-sql-架构原理

来源:互联网 发布:js跨域方法 编辑:程序博客网 时间:2024/05/22 07:49

整体架构
spark-sql整体架构

详解

这里写图片描述

源码结构

catalyst
这里写图片描述

sql
这里写图片描述

hive
这里写图片描述

hive-thriftserver
这里写图片描述

原理

SQLText
–>Parsing
–>Unresolved Logical Plan
–>Binding & Analyzing
–>logical plan
–>optimizing
–>optimized logical plan
–>query planning
–>physical plan

可能生成多种物理计划
通过方法 评估 哪种方案 最快 节省资源 最少

一个树的结构 比如:
PROJECT name
||
select
students
||
WHERE age<=18

SqlParser–>DataFrame(unresolved LogicalPlan tree的语法树)
–>RDD
–>transformation action

–>SQLContext executor.sql()

–>QueryExecution–>Analyzer.apply()


–>resolved Logicalplan 与数据源绑定
不知道表在哪里?
临时表在哪里

Resolved LogicalPlan 与 SQL中的数据源

(studentDF.registerTemplate(‘students’)) 进行绑定

知道从哪个数据源中查询

query excution

anlayzer的apply()方法执行结束后得到Resolved LogicalPlan


Analysis && binding
通过cacheManager 执行缓存的操作
如果之前已经缓存过执行计划 再次执行 使用缓存中的数据


optimizer
batches是非常非常重要的
封装了每一个Spark sql版本中 可以对逻辑执行计划执行的优化策略
optimizer重点是理解它的各种优化策略

调用Optimizer的apply() 方法

针对Resolved LogicalPal调用Optimizer 进行优化

获得优化后的逻辑执行计划

优化策略建议的方式编写SQL语句

Combiner 其实就是合并limit语句
比如 你的SQL语句中 有多个limit子句 取一个并集就可以
尽量避免值出现null 出现 否则数据倾斜

直接计算获得常量 尽量给出
UnionPuushDown 将Union下推 filter pushdown 将union where 下推到子查询中 尽量早的执行union操作和where 操作
避免在外层查询中 针对大量的数据 两张大表 执行where 操作

合并fitlter 就是合并where子句 比如子查询中有针对某个字段的where 子句
外层查询中也有针对同样一个字段的where子句
那么 此时可以合并where子句 只保留一个即可 取并集即可
我们自己写SQL的时候 也要注意到这个where使用
如果针对一个字段 写一次就好

列裁剪 要查询的列

生成Optimized LogcalPlan


SparkPlanner
逻辑执行计划 具体化 物化

PrepareforExecutor()

SparkPlanner生成一个可以执行的sparkplan 物理执行计划
已经绑定到了物理的数据源

知道对各个表的join
如果进行jion 包括jion的时候 默认spark内部会对小表进行广播

生成 SparkPlan (Physical Plan).executor()

原创粉丝点击