在hive的代码中核心是一个算子树,在算子树优化以及查询计划(MR序列)的生成过程中,多次使用算子树遍历设计模式,这里从总体上对这个设计模式进行介绍。
图遍历过程中包含两个模块的工作:分别是遍历器和调度器
1、遍历器(GraphWalker):对一颗算子树(或者任务树)进行遍历,遍历是扫描树中的每一个节点的过程,每次经过一个节点的时候,这里包含两个信息,当前节点以及当前状态(这个状态包括这个节点是否已经被调度过等),每次经过一个节点的时候需要根据当前状态以及相应的策略,决定是否对当前的节点进行调度(dispatch)
接口定义如下:
public interface GraphWalker {
void startWalking(Collection<Node> startNodes,
HashMap<Node, Object> nodeOutput) throws SemanticException;
}
2、调度器(Dispatcher):遍历器有一个调度器,每次遍历器决定对一个节点进行调度的时候,就会调用调度器运行,将节点信息,以及当前的节点状态栈(一般包含当前节点的父子节点等信息)传递给调度器,调度器进行处理。调度器的作用通常是根据当前节点以及栈信息,来判断是否符合某些特定的规则,如果满足,则进行对应的处理。这些处理并不会修改原始的算子树,而是在相关联的上下文(NodeProcessorC