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源码解析(三 ...
随机推荐
- SQL农历转换函数(显示中文格式,加入润月的显示)
if object_id('fn_getlunar') is not null drop function fn_getlunar go create function dbo.fn_getlunar ...
- C#重写ToString
C# 中的每个类或结构都可隐式继承 <xref:System.Object> 类. 因此,C# 中的每个对象都会获取 <xref:System.Object.ToString%2A& ...
- GUC-10 线程八锁
/* * 题目:判断打印的 "one" or "two" ? * * 1. 两个普通同步方法,两个线程,标准打印, 打印? //one two * 2. 新增 ...
- CentOS7.5安装cairo-dock,比mac托盘还美
1.下载安装nux-desktop 到http://li.nux.ro/download/nux/dextop/el7/x86_64/找到nux-dextop-release-xxxx.nux.noa ...
- 8VC Venture Cup 2016 - Final Round (Div. 1 Edition) E - Preorder Test 树形dp
E - Preorder Test 思路:想到二分答案了之后就不难啦, 对于每个答案用树形dp取check, 如果二分的值是val, dp[ i ]表示 i 这棵子树答案不低于val的可以访问的 最多 ...
- UESTC - 594 我要长高
他们oj挂掉啦, 我先保存一下代码... 直接dp复杂度, n * 100 * 100, 我们可以将前一个人的信息丢进单调队列中去,可以优化成n * 100; #include<bits/std ...
- 【运维实战】一次linux日志分割之路——将日志按照每小时进行分割,并按照“日期-小时”格式保存
是这样的,现在需要对nginx的access.log进行按照每小时进行分割,并且最好还要能够以 “日期+时间”的形式,命名保存. 两点,一个是按照每小时进行分割,一个是将日志以“日期+时间”的形式进行 ...
- Picasso:开启大前端的未来
“道生一,一生二,二生三,三生万物.” —— <道德经> Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应 ...
- Revit二次开发示例:ChangesMonitor
在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息. #region Namespaces using System; using System.Collections.Ge ...
- 支撑大规模公有云的Kubernetes改进与优化 (2)
接下来我们按照kubernetes创建容器的详细过程,以及可能存在的问题. 一.API Server的认证,鉴权,Quota 当客户需要创建一个pod的时候,需要先请求API Server. Kube ...