2021SC@SDUSC
山大软工实践hive(7)-查看各优化器内容
1
这一次来看看优化器的源码,先看PointLookupOptimizer

翻译意思是此优化将采用一个筛选器表达式,如果其谓词包含其子级为常量相等表达式的OR运算符,它将尝试生成IN子句(这更有效)。如果OR运算符包含AND运算符子级,则优化可能会生成一个使用结构的IN子句。
首先老版hive是不支持in字句的,然后这里是对常量等值表达式的or字句转化为in字句
struct是hive的一种复杂数据类型,可以包含不同数据类型的元素。这里的structs应该指的是它

这个解释中的“点语法”让我产生联想,毕竟优化器名字是PointLookUp
暂时没头绪,先看它的transform方法

Rule类

看意思是用于限定dispatcher向进程分发operator的规则,可以通过计算开销之类的,具体什么用不清楚
NodeProcessor类

处理op的基类,实现没有特殊需求的op的通用处理流程,也不知道具体干啥,继续向下看
opRules.put的第一个参数,跳转过去

RuleRegExp类,说是处理各表达式的
看这个被调用的类,和正则表达式有关,它举的例子是TS.*RS,意思是TS后面跟着任意算子,最后跟一个RS(比如可以是TS FIL RS,可以是TS FIL LIM RS)
FilterOperator.getOperatorName(),连起来就是FIL%

再看正则表达式那边,第一个if语句里的方法,它的作用是看wildcards里有没有这个regExp,有返回true,无返回false



很明显没有%,应该返回false。所以会执行 this.patternWithoutWildCardChar = regExp;就说没有这个,所以这%目前加的莫名其妙。接着往下看

这个方法只做初始化
再看GraphWalker,第一印象感觉是用于游走DAG的,很明显是个接口

看到有多个startnode,和DAG相符
再看这里的FowardWalker

方法指向父类DefaultGraphWalker

类的注释说用户注册规则,然后最相符的进程的最接近的rule被激活。这里的概念很模糊(看不懂)
2
暂时没头绪,看另外一个ConstantPropagate(跳过了一个,那个实现的功能也看不懂,这个的好歹有对应)

这个意外地眼熟,对应的是常量折叠3种的逻辑优化(在第5篇提到),能看出它的优化形式是从根节点遍历DAG,看看它的transform方法

结构和PointLookUp的transform差不多(看了一下其他优化器也一样),也就是说结构大体是 创建opRules的Map->向其中放入算子,,,嗯,既然暂时不知道opRules干了啥,应该接着向下看才对,所以先返回 PointLookupOptimizer
3

回头看transform方法最后一段,接下来是建立一个Node的数组,添加pctx中的所有头结点,然后再用graphwalker开始walk
先看Node干什么用的

此接口定义了Walker和dispatchers所需的功能。由需要遍历的图的节点实现。
总之和图的遍历有关,接口的两个方法分别用于图遍历和分发器,getChildren就获得子节点,GetName得到的应该是“R1”这样的字符(猜测),然后突然意识到Operator

继承了Node,之前没看到,也就是说,DAG的节点的最抽象的描述就是Node
另外,pctx是ParseContext类的

看意思是和解析上下文与操作符树(DAG)有关,说parse context 包含DAG,所以可以认为成员变量包含DAG的节点记录

然后通过pctx调用的方法,找到返回的值(图中蓝色标记部分),记录了所有以TS节点开头的头结点!
除此之外,它还记录了一些特别的算子如SMBjoin,join,RS,可能是为了方便相关的优化?
所以最后一段代码的意思很明确了,就是获取所有DAG的头节点后启动walk,现在去看starkwalking方法,这是下一步的目的
可能的接下来
starkwalking方法
Rule,NodeProcessor干了啥
整理这个transform方法每一步做了什么,达到什么效果
知道这个优化器什么效果
横向查看其它优化器
本文详细探讨了Hive的两种查询优化器——PointLookupOptimizer和ConstantPropagate。PointLookupOptimizer将常量等值表达式的OR运算符转化为IN子句,提高查询效率。它通过遍历DAG来应用优化规则。ConstantPropagate则是进行常量折叠的逻辑优化,从DAG的根节点遍历以进行优化。文章还提及了Rule和NodeProcessor类的作用,以及GraphWalker接口在遍历DAG过程中的角色。

被折叠的 条评论
为什么被折叠?



