Whole View
本文分析的是逻辑执行计划优化的代码结构,具体每种Rule的实现不做分析。
看本文之前最好参考之前那篇逻辑执行计划模型的文章。

Architecture
几个关键类/接口的关系:
Optimizer
PlanOptimizer是抽象类,主要和Rule、PlanTransformListener、OperatorPlan打交道。
public abstract class PlanOptimizer {
protected List<Set<Rule>> ruleSets;
protected OperatorPlan plan;
protected List<PlanTransformListener> listeners;
protected int maxIter;
它接受一个OperatorPlan,即Operators的DAG模型,在optimize()方法里,遍历ruleSet,得到几批Rules,即Set<Rule>。对于每批Rules,调用每个rule.match(plan)来处理传入的OperatorPlan,返回一个匹配成功的List<OperatorPlan> matches,对这些match的plans进行进一步处理。首先获得rule的transformer,然后进行transformer的check()和transform()操作。如果需要Listener操作的,还会遍历listeners,让每个PlanTransformListener监听到transformer进行的transform操作,transformer的reportChanges()方法可以返回他transform操作修改的部分。
代码如下:
public void optimize() throws FrontendException {
for (Set<Rule> rs : ruleSets) {
boolean sawMatch = false;
int numIterations = 0;
do {
sawMatch = false;
for (Rule rule : rs) {
List<OperatorPlan> matches = rule.match(plan);
if (matches != null) {
Transformer transformer = rule.getNewTransformer();
for (OperatorPlan m : matches) {
try {
if (transformer.check(m)) {
sawMatch = true;
transformer.transform(m);
if (!rule.isSkipListener()) {
for(PlanTransformListener l: listeners) {
l.transformed(plan, transformer.reportChanges());
}
}
}
} catch (Exception e) {
StringBuffer message = new StringBuffer("Error processing rule " + rule.name);
if (!rule.isMandatory()) {
message.append(". Try -t " + rule.name);
}
throw new FrontendException(message.toString(), 2000, e);
}
}
}
}
} while(sawMatch && ++numIterations < maxIter);
}
}
实现类:

LogicalPlanOptimizer
LogicalPlanOptimizer类是PlanOptimizer的子类
默认加载两个Listener:

Listener的这两个实现在PlanTransformerListener一节具体展开讲述。
初始化的时候会buildRuleSets(),把需要添加的Rule都生成出来,然后校对该Rule是否被强制加入,或被turn off,从而选择性地放入优化规则。以下列举了所有候选的优化规则,Rule是顺序执行的:

Transformer
Transformer是抽象类,有三个方法需要子类实现:
check()方法,利用pattern来匹配plan里符合的operator集合,返回match的operator集
transform()方法,具体实施对tree的转换操作
reportChanges()方法,报告tree的哪部分被transform操作过了(只包括被修改了的或增加了的,不包括删除的node),目的是为了让Listener得知,从而可以修改schema或annotation等等。
继承结构如下:
PlanTransformerListener
PlanTransformListener监听一个plan被修改后会触发。
举例:
当一个Rule把一次join里的Filter步骤提前到join操作之间做,那么过滤部分的input schema很可能需要改变,此时一个schema listener就会被触发并执行。
PlanTransformListener是一个接口,需要实现一个方法:
public void transformed(OperatorPlan fp, OperatorPlan tp) throws FrontendException;
下面具体介绍两个实现类
ProjectionPatcher
作用是在映射操作中修补引用信息
有两个内部静态类

SchemaPatcher
使用于逻辑执行计划优化过程,当plan被transform了之后修补schema信息。
Rule
public abstract class Rule {
protected String name = null;
protected OperatorPlan pattern;
transient protected OperatorPlan currentPlan;
private transient Set<Operator> matchedNodes =
new HashSet<Operator>();
private boolean mandatory;
private boolean skipListener = false;
Rule已经把 match(OperatorPlan plan)方法的逻辑实现好了。
子类需要实现的是buildPattern()方法,来制定各自的”模式”,即pattern变量。
子类还需要实现getNewTransformer()方法来实例化一个transformer,transformer的check()和transform()方法会进一步处理rule匹配的operators。
Rulematch()的用途是确保plan的所有子plan都满足该rule的pattern。
实现逻辑比较繁杂。
Rule继承结构

具体每个Rule不分析了。
全文完 :)
分享到:
相关推荐
本文将基于"Pig的源码包"这一主题,深入探讨Pig的核心概念、架构设计以及源码分析。 1. Pig Latin:Pig Latin是Pig的专用脚本语言,它的设计目标是简化MapReduce编程。通过抽象出一系列操作(如LOAD、FILTER、JOIN...
Pig 0.15版本引入了许多性能优化策略,如并行执行、物理计划优化等。通过源码,我们可以学习到如何在分布式环境中优化数据处理的性能。 通过深入学习Pig 0.15的源码,不仅可以增强对Hadoop生态系统的理解,还能...
通过源码分析,我们可以了解这些过程的工作原理。 六、Pig与Hadoop的集成 Pig运行在Hadoop之上,利用Hadoop的分布式计算能力。源码中可能包含了如何在Hadoop集群上运行Pig脚本的示例,以及如何配置Pig与Hadoop的...
3. **Logical and Physical Plans**:在源码中,我们可以看到 Pig 如何构建逻辑计划(Logical Plan)和物理计划(Physical Plan),这是将高级操作转化为低级数据流操作的关键步骤。 4. **Operators**:Pig 提供了...
对于“源码”,理解 Pig 的工作原理可能需要查看其内部代码,这有助于开发者定制功能或优化性能。而“工具”则强调了 Pig 是一个实用的开发工具,它简化了大数据处理的复杂性,使用户能够专注于业务逻辑而不是底层...
Pig提供了一种抽象层,降低了编写大数据处理程序的复杂度,使得数据科学家和分析师能够更专注于业务逻辑,而不是底层的分布式计算细节。 文件列表中的"hbase.txt"可能包含了HBase的安装指南、配置参数、操作命令或...
源码分析将帮助我们理解这些优化策略。 7. **Pig运行环境**: Pig可以在多种环境中运行,包括本地模式、Hadoop分布式模式等。通过源码,我们可以了解Pig如何适应不同的运行环境,以及如何与Hadoop生态系统中的其他...
本文将围绕其功能特性、设计理念以及源码分析等方面进行详细阐述。 首先,"pig权限管理系统"是一款基于角色的权限控制(Role-Based Access Control, RBAC)模型的系统。RBAC模型通过定义角色和权限的关系,实现用户...
这种模型使得开发者可以专注于编写业务逻辑,而无需关心分布式执行的细节。 3. **Hadoop源码分析**:通过阅读Hadoop的源码,我们可以了解到其内部的工作流程、数据流向以及错误处理机制等。例如,可以研究NameNode...
- 性能优化:考虑并行处理、数据分区、缓存等技术来提升ETL效率。 - 容错与重试机制:设计合理的错误处理策略,确保ETL任务的稳定性。 - 日志与监控:记录详细的ETL执行日志,设置性能指标监控,以便于问题排查和...
1. 性能优化:Hadoop 3.1.2在性能上进行了诸多优化,如提升NameNode的元数据处理能力,减少数据传输的网络开销,支持更高效的Block副本策略等。开发者可以通过源码学习到这些优化策略,为自己的应用定制更高效的解决...
执行引擎负责解析、优化和执行查询计划。 2. **HQL(Hive Query Language)**:HQL 是 Hive 的查询语言,它借鉴了 SQL 的语法,支持 SELECT、FROM、WHERE、GROUP BY、JOIN 等子句,但并不完全兼容 SQL。HQL 查询被...
源码中的 `optimizer` 目录包含了相关的算法和逻辑。 10. **数据倾斜处理**: Hive 还提供了处理数据倾斜的策略,例如动态分区和负载均衡。 通过阅读和分析 `apache-hive-1.2.1-src` 中的源码,开发者可以深入理解 ...
1. **SQL性能优化之Toad for Oracle分析与调优.doc**:这可能是一个关于Oracle数据库性能优化的文档,Toad是常用的Oracle数据库管理工具,提供了查询分析和性能优化的功能,对于理解SQL执行效率有帮助,虽然不是直接...
7. **数据流处理**:可能使用Hadoop的其他工具,如Pig或Hive,来进行复杂的数据分析和报表生成。这些工具简化了对Hadoop集群的数据操作,使非程序员也能处理大数据。 8. **监控与优化**:项目实施过程中,还需要...
Pig,一个高级的数据流语言和执行框架,用于处理大规模数据集;HBase,一个非关系型的分布式数据库,用于存储结构化数据;ZooKeeper,一个协调服务,用于维护配置信息、命名、提供分布式同步等功能。 在使用Hadoop...
源码是理解程序工作原理的基础,通过分析源码,开发者可以学习到程序的设计思路和算法实现。 3. **多媒体资源**:Pig.bmp、Ground.bmp等.bmp格式的文件是位图图像资源,它们提供了动画中的静态背景或角色图像。位图...
总之,《Hadoop权威指南》中文版和源码是一份宝贵的教育资源,它不仅帮助你理解和掌握Hadoop的基础知识,还引导你进入大数据的世界,探索更多可能的数据分析和处理方法。通过深入学习,你将成为一个熟练的Hadoop...
这里的“源码”标签暗示我们需要关注如何实现和优化这两个组件的代码。开发者通常会使用Hadoop的Java API来编写Mapper和Reducer,但也有一些其他的编程语言支持,如Python和Scala。 `工具`标签则意味着我们还需要...
至于“开发新的数据算法”,Hadoop提供了丰富的API和工具,如Pig、Hive、Spark等,可以用于处理和分析大数据。你可以在Java、Python或其他支持的语言中编写MapReduce程序,实现自己的数据处理逻辑。 总结来说,本...