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

Physical Plan生成过程

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

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

Pig系统分析(5)-从Logical Plan到Physical Plan_第1张图片

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

public void walk(PlanVisitorvisitor) throws FrontendException {
        List fifo = new ArrayList();
        Set seen = new HashSet();
        List 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方法。

Pig系统分析(5)-从Logical Plan到Physical Plan_第2张图片

Physical Plan结构

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

Pig系统分析(5)-从Logical Plan到Physical Plan_第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 implements Iterable, Serializable, Cloneable {
    protected Map mOps;
    protected Map mKeys;
    protected MultiMap mFromEdges;
    protected MultiMap mToEdges;
}

你可能感兴趣的:(~Pig,Distributed,Programming,Pig系统分析)