2021SC@SDUSC

山大软工实践hive(7)-查看各优化器内容


文章目录

  • 山大软工实践hive(7)-查看各优化器内容
  • 1
  • 2
  • 3
  • 可能的接下来


1

这一次来看看优化器的源码,先看PointLookupOptimizer

hive脚本CPU优化 hive 优化器_hadoop


翻译意思是此优化将采用一个筛选器表达式,如果其谓词包含其子级为常量相等表达式的OR运算符,它将尝试生成IN子句(这更有效)。如果OR运算符包含AND运算符子级,则优化可能会生成一个使用结构的IN子句。

首先老版hive是不支持in字句的,然后这里是对常量等值表达式的or字句转化为in字句

struct是hive的一种复杂数据类型,可以包含不同数据类型的元素。这里的structs应该指的是它

hive脚本CPU优化 hive 优化器_hadoop_02


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

hive脚本CPU优化 hive 优化器_hive脚本CPU优化_03


Rule

hive脚本CPU优化 hive 优化器_hive_04


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

hive脚本CPU优化 hive 优化器_运算符_05


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

hive脚本CPU优化 hive 优化器_hive_06


RuleRegExp类,说是处理各表达式的

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

hive脚本CPU优化 hive 优化器_hadoop_07


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

hive脚本CPU优化 hive 优化器_hadoop_08


hive脚本CPU优化 hive 优化器_hive脚本CPU优化_09


hive脚本CPU优化 hive 优化器_hadoop_10


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

hive脚本CPU优化 hive 优化器_hive_11


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

hive脚本CPU优化 hive 优化器_hive_12


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

hive脚本CPU优化 hive 优化器_运算符_13


方法指向父类DefaultGraphWalker

hive脚本CPU优化 hive 优化器_正则表达式_14


类的注释说用户注册规则,然后最相符的进程的最接近的rule被激活。这里的概念很模糊(看不懂)

2

暂时没头绪,看另外一个ConstantPropagate(跳过了一个,那个实现的功能也看不懂,这个的好歹有对应)

hive脚本CPU优化 hive 优化器_hive脚本CPU优化_15


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

hive脚本CPU优化 hive 优化器_运算符_16


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

3

hive脚本CPU优化 hive 优化器_正则表达式_17


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

先看Node干什么用的

hive脚本CPU优化 hive 优化器_hive脚本CPU优化_18


此接口定义了Walker和dispatchers所需的功能。由需要遍历的图的节点实现。

总之和图的遍历有关,接口的两个方法分别用于图遍历和分发器,getChildren就获得子节点,GetName得到的应该是“R1”这样的字符(猜测),然后突然意识到Operator

hive脚本CPU优化 hive 优化器_hadoop_19


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

hive脚本CPU优化 hive 优化器_hive脚本CPU优化_20


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

hive脚本CPU优化 hive 优化器_hive_21


然后通过pctx调用的方法,找到返回的值(图中蓝色标记部分),记录了所有以TS节点开头的头结点!

除此之外,它还记录了一些特别的算子如SMBjoin,join,RS,可能是为了方便相关的优化?

所以最后一段代码的意思很明确了,就是获取所有DAG的头节点后启动walk,现在去看starkwalking方法,这是下一步的目的

可能的接下来

starkwalking方法
Rule,NodeProcessor干了啥
整理这个transform方法每一步做了什么,达到什么效果
知道这个优化器什么效果
横向查看其它优化器