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一一对应,但存在几个明显区别:
- 物理执行计划中包含了实际使用的Loader和Store,以及要操作的文件实际路径。
- Group操作被分成了三部分:Local Rearrage、Global Rearrange和Package。(分别对应map-reduce中的map、shuffle和reduce)
- 非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
- Pig系统分析(5)-从Logical Plan到Physical Plan
- Pig系统分析(3)-从Pig Latin到Logical plan
- Pig系统分析(6)-从Physical Plan到MR Plan再到Hadoop Job
- Pig系统分析(4)-Logical Plan Optimizer
- plan
- plan
- Plan
- plan
- plan
- PLAN...
- plan
- .plan
- plan
- Plan
- plan
- plan
- plan
- plan
- JavaBean在J2EE程序里的应用
- 乐观锁与悲观锁
- Xcode自定义Eclipse中常用的快捷键
- TCP/IP子网掩码教程
- python查找并更新数据库
- Pig系统分析(5)-从Logical Plan到Physical Plan
- 全文检索原理(Luence倒排索引原理) 学Luence必看
- When An SO is closed ,how to cancel it
- Java - IP地址与数字之间互转
- 赚钱很难吗?
- jQuery EasyUI Combobox无法检索中文输入的问题
- Talend FAQ
- Servlet 细节总结
- CSharp_DevExpress_编辑器自定义;