Pig系统分析(5)-从Logical Plan到Physical Plan
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;
}
Pig系统分析(5)-从Logical Plan到Physical Plan的更多相关文章
- Pig系统分析(6)-从Physical Plan到MR Plan再到Hadoop Job
从Physical Plan到Map-Reduce Plan 注:由于我们重点关注的是Pig On Spark针对RDD的运行计划,所以Pig物理运行计划之后的后端參考意义不大,这些部分主要分析流程, ...
- 第六篇:Spark SQL Catalyst源码分析之Physical Plan
/** Spark SQL源码分析系列文章*/ 前面几篇文章主要介绍的是spark sql包里的的spark sql执行流程,以及Catalyst包内的SqlParser,Analyzer和Optim ...
- Catalyst揭秘 Day6 Physical plan解析
Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...
- 第七篇:Spark SQL 源码分析之Physical Plan 到 RDD的具体实现
/** Spark SQL源码分析系列文章*/ 接上一篇文章Spark SQL Catalyst源码分析之Physical Plan,本文将介绍Physical Plan的toRDD的具体实现细节: ...
- Pig系统分析(8)-Pig可扩展性
本文是Pig系统分析系列中的最后一篇了,主要讨论怎样扩展Pig功能.不仅介绍Pig本身提供的UDFs扩展机制,还从架构上探讨Pig扩展可能性. 补充说明:前些天同事发现twitter推动的Pig On ...
- Spark SQL 源代码分析之Physical Plan 到 RDD的详细实现
/** Spark SQL源代码分析系列文章*/ 接上一篇文章Spark SQL Catalyst源代码分析之Physical Plan.本文将介绍Physical Plan的toRDD的详细实现细节 ...
- ADF_Database Develop系列2_通过UML数据库开发之将Logical UML转为Physical Models
2013-05-01 Created By BaoXinjian
- Pig系统分析(7)-Pig有用工具类
Explain Explain是Pig提供的调试工具,使用explain能够输出Pig Lation的运行计划.值得一提的是,explain支持-dot选项.将运行计划以DOT格式输出, (DOT是一 ...
- Spark SQL源码解析(四)Optimization和Physical Planning阶段解析
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
随机推荐
- thinkphp5与thinkphp3.X对比
原文https://www.cnblogs.com/wupeiky/p/5850108.html 首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的 ...
- AdvStringGrid 单元格字体颜色、背景颜色
procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...
- MFC+WinPcap编写一个嗅探器之七(协议)
这一节是本系列教程的结尾了,内容也比较简单,主要是对网络协议进行分析,其实学过计算机网络的同学完全可以略过 在整个项目中需要有一个头文件存放各层协议的头部定义,我把它们放在了head.h中,这个头文件 ...
- 【51nod】1851 俄罗斯方块
题解 最近一遇到神仙题一卡就好久--做点水题滋养一下自己吧= = 显然我们发现放一个方块的奇偶性不会改变,所以格子如果黑格子是奇数,那么就是No 我们发现每个2 × 3的方格里的2 × 1的黑格子都可 ...
- FPGA In/Out Delay Timing Constaint
先简单说说这段时间遇到的问题.FPGA采集前端scaler的视频数据.像素时钟(随路时钟),视频数据,行场同步,DE.这些信号进入FPGA后.通过CSC(颜色空间转换).输出后的图像有噪点.通过查看时 ...
- ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)
题目链接 ZOJ Monthly, March 2018 Problem G 题意 给定一个字符串.现在求一个下标范围$[0, n - 1]$的$01$序列$f$.$f[x] = 1$表示存在一种 ...
- Java使用AES加密解密
AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...
- ACM 水果 hdu 1263 一题多解
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1263 文章末有相应的一些测试数据供参考. 传统的数组解题方式 思路一: 三种属性的数据放在一个结构体里面, ...
- ActiveMQ (三):项目实践
1. 简单项目demo Com.hoo.mq路径下(除了com.hoo.mq.spring)是普通java中使用activeMQ. Com.hoo.mq.spring路径下是非web环境spring集 ...