整体架构
详解
源码结构
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()