Pig系统分析(5)-从Logical Plan到Physical Plan

来源:互联网 发布:百度提问软件 编辑:程序博客网 时间:2024/05/17 22:12

Physical Plan生成过程

优化后的逻辑执行计划被LogToPhyTranslationVisitor处理,生成物理执行计划。

这是一个经典的Vistor设计模式应用场景。

其中,LogToPhyTranslationVisitor的visit()为入口方法,通过DependencyOrderWalker遍历处理逻辑执行计划中的每一个LogicalRelationalOperator。DependencyOrderWalker按照依赖顺序遍历DAG中节点,保证当且仅当节点的所有前驱都被访问后,它才会被访问。核心逻辑如下,doAllPredecessors递归调用自己,将符合无前驱条件的节点添加到fifo队列中,最终实现的效果等效于将图拓扑排序后顺序访问。

public void walk(PlanVisitorvisitor) throws FrontendException {        List<Operator> fifo = new ArrayList<Operator>();        Set<Operator> seen = new HashSet<Operator>();        List<Operator> leaves = plan.getSinks();        if (leaves == null) return;        for (Operator op : leaves) {            doAllPredecessors(op, seen, fifo);        }        for (Operator op: fifo) {            op.accept(visitor);        }}
接下来,每个LogicalRelationalOperator又反过来调用LogToPhyTranslationVisitor相应的visit方法对自身进行处理,转化成PhysicalOperator。最终生成完整的逻辑执行计划。下图是LogToPhyTranslationVisitor中所有的visit operator方法。


Physical Plan结构

分析之前Pig系统分析(3)中代码生成的执行计划,如图所示:


下面是完整的物理执行计划。物理执行计划与逻辑执行计划结构类似,部分Operator一一对应,但存在几个明显区别:

  1. 物理执行计划中包含了实际使用的Loader和Store,以及要操作的文件实际路径。
  2. Group操作被分成了三部分:Local Rearrage、Global Rearrange和Package。(分别对应map-reduce中的map、shuffle和reduce)
  3. 非replicate的join操作先被转换成CoGroup和Foreach操作,然后CoGroup操作与Group操作类似,也被转换为Local Rearrage,Global Rearrange和Package三步。

F:Store(output:org.apache.pig.builtin.PigStorage) - scope-28||---F: New ForEach(false,false)[bag] - scope-27    |   |    |  Project[bytearray][0] - scope-22    |   |    |  POUserFunc(org.apache.pig.builtin.COUNT)[long] - scope-25    |   |    |  |---Project[bag][1] - scope-24    |    |---E: Package[tuple]{bytearray} - scope-19        |        |---E: Global Rearrange[tuple] -scope-18            |            |---E: LocalRearrange[tuple]{bytearray}(false) - scope-20                |   |                |   Project[bytearray][2] - scope-21                |                |---D: New ForEach(true,true)[tuple] - scope-17                    |   |                    |   Project[bag][1] - scope-15                    |   |                    |   Project[bag][2] - scope-16                    |                    |---D:Package[tuple]{bytearray} - scope-10                        |                        |---D: GlobalRearrange[tuple] - scope-9                            |                            |---D: LocalRearrange[tuple]{bytearray}(false) - scope-11                            |   |   |                            |   |  Project[bytearray][0] - scope-12                            |   |                            |   |---C: Filter[bag] - scope-1                            |       |  |                            |       |  Greater Than[boolean] - scope-5                            |       |  |                            |       |  |---Cast[int] - scope-3                            |       |  |   |                            |      |   |   |---Project[bytearray][1] - scope-2                            |       |  |                            |       |  |---Constant(0) - scope-4                            |       |                            |       |---A: Load(file:///D:/Develop/projects/pig/file1:org.apache.pig.builtin.PigStorage)- scope-0                            |                            |---D: LocalRearrange[tuple]{bytearray}(false) - scope-13                                |   |                                |  Project[bytearray][1] - scope-14                                |                                |---B:Load(file:///D:/Develop/projects/pig/file2:org.apache.pig.builtin.PigStorage) -scope-6

PhysicalPlan类代表物理执行计划,继承自OperatorPlan。(继承时会使用PhysicalOperator替换下面代码片段中泛型参数E)

public abstract class OperatorPlan<E extends Operator> implements Iterable<E>, Serializable, Cloneable {    protected Map<E, OperatorKey> mOps;    protected Map<OperatorKey, E> mKeys;    protected MultiMap<E, E> mFromEdges;    protected MultiMap<E, E> mToEdges;}

1 0
原创粉丝点击