Spark-源码学习-SparkSQL-架构设计-SQL 引擎-Strategy 体系-QueryPlanner
一、概述
SparkPlanner 继承自 SparkStrategies 类,而 SparkStrategies 类则继承自 QueryPlanner 基类,重要的 plan() 方法实现就在 QueryPlanner 类中 。 SparkStrategies 类本身不提供任何方法,而是在内部提供一 批 SparkPlanner 会用到的各种策略( Strate盯)实现。 最后 ,在 SparkPlanner 层面将这些策略整
合在一起,通过 plan()方法进行逐个应用 。
类似逻辑计划阶段的 Anaylzer 和 Optimizer,SparkPlanner 本身只是一个逻辑的驱动 ,各种策略的 apply 方法把逻辑执行计划算子映射成物理执行计划算子。
二、实现
2.1. $plan$
$plan$ 方法传入 LogicalPlan 作为参数,将 strategies 应用 到 LogicalPlan,生成物理计划候选集合(Candidates)。 如果该集合中存在 PlanLater 类型的 SparkPlan,则通过 placeholder 中间变量取 出对应的 LogicalPlan 后,递归调用 plan()方法,将 PlanLater 替换为子节点的物理计划 。 最后,对物理计划列表进行过滤,去掉一些不够高效的物 理计划。
1 | def plan(plan: LogicalPlan): Iterator[PhysicalPlan] = { |
2.1.1. 收集物理计划的候选者
1 | val candidates = strategies.iterator.flatMap(_(plan)) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo