静下心来读源码,给想要了解spark sql底层解析原理的小伙伴们!
【本文大纲】
1、前言
2、Strategy
3、Batch(包含一个或多个Rule及一个策略)
4、batches: Seq[Batch](Batch队列)
5、execute(核心方法)
前言
Spark sql通过Analyzer中 定义的rule把Parsed Logical Plan解析成 Analyzed Logical Plan;通过Optimizer定义的rule把 Analyzed Logical Plan 优化成 Optimized Logical Plan 。
下图是RuleExecutor类 的继承关系,Analyzer、Optimizer都继承了RuleExecutor。
Analyzer、Optimizer定义了一系列 rule,而RuleExecutor 定义了一个 rules 执行框架,即怎么把一批批规则应用在一个 plan 上得到一个新的 plan。
规则是怎么执行的 ?
RuleExecutor包含以下主要对象
abstract class RuleExecutor[TreeType <: TreeNode[_]] extends Logging {
abstract class Strategy {
def maxIterations: Int
def errorOnExceed: Boolean = false
def maxIterationsSetting: String = null
}
case object Once extends Strategy { val maxIterations = 1 }
case class FixedPoint(
override val maxIterations: Int,
override val errorOnExceed: Boolean = false,
override val maxIterationsSetting: String = null) extends Strategy
protected case class Batch(name: String, strategy: Strategy, rules: Rule[TreeType]*)
protected def batches: Seq[Batch]
Strategy
Strategy 定义了Rule处理的迭代策略,有些Rule只用执行一次,有些需要多次直到达到某种效果。
abstract class Strategy {
//表示 Batch 最大执行次数,有可能是一次或多次。如果执行了 maxIterations 次之前达到收敛点,就停止,不再继续执行 Batch
def maxIterations: Int
//决定如果执行次超过了最大迭代次数是否抛出异常
def errorOnExceed: Boolean = false
//是大执行次数可以在配置文件里配制,这里是获取配制文件中key。
def maxIterationsSetting: String = null
}
Strategy有两个实现类 :Once、FixedPoint