文章目录
前言
在Flink1.9之前只使用Calcite的优化器进行优化,之后因为Blink的合入才带来了Flink自己的优化器。本文以Flink1.8为例子,看看Calcite的优化规则应该怎么使用。
优化
优化方式
Calcite有两种优化方式,Flink所有的优化规则也都是用的这两种
runHepPlanner
Flink在使用HepPlanner的时候拆成了三层,最底层的负责创建Calcite的HepPlanner并执行
protected def runHepPlanner(
hepProgram: HepProgram,
input: RelNode,
targetTraits: RelTraitSet): RelNode = {
val planner = new HepPlanner(hepProgram, frameworkConfig.getContext)
planner.setRoot(input)
if (input.getTraitSet != targetTraits) {
planner.changeTraits(input, targetTraits.simplify)
}
planner.findBestExp
}
中间层控制规则是否重复使用,更具体来说就是某条规则创建了新节点后,是否再使用之前的规则。
/*新节点不会应用之前的规则*/
protected def runHepPlannerSequentially(
hepMatchOrder: HepMatchOrder,
ruleSet: RuleSet,
input: RelNode,
targetTraits: RelTraitSet): RelNode = {
val builder = new HepProgramBuilder
builder.addMatchOrder(hepMatchOrder)
val it = ruleSet.iterator()
while (it.hasNext) {
builder.addRuleInstance(it.next())
}
runHepPlanner(builder.build(), input, targetTraits)
}
/*新节点会应用所有的规则即之前的规则可能会再次应用*/
protected def runHepPlannerSimultaneously