`
jgsj
  • 浏览: 1051266 次
文章分类
社区版块
存档分类
最新评论

Pig源码分析: 逻辑执行计划优化

 
阅读更多

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

使用于逻辑执行计划优化过程,plantransform了之后修补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的源码包"这一主题,深入探讨Pig的核心概念、架构设计以及源码分析。 1. Pig Latin:Pig Latin是Pig的专用脚本语言,它的设计目标是简化MapReduce编程。通过抽象出一系列操作(如LOAD、FILTER、JOIN...

    pig源码0.15版

    Pig 0.15版本引入了许多性能优化策略,如并行执行、物理计划优化等。通过源码,我们可以学习到如何在分布式环境中优化数据处理的性能。 通过深入学习Pig 0.15的源码,不仅可以增强对Hadoop生态系统的理解,还能...

    pig编程指南源码

    通过源码分析,我们可以了解这些过程的工作原理。 六、Pig与Hadoop的集成 Pig运行在Hadoop之上,利用Hadoop的分布式计算能力。源码中可能包含了如何在Hadoop集群上运行Pig脚本的示例,以及如何配置Pig与Hadoop的...

    pig-0.11.1.tar.gz

    3. **Logical and Physical Plans**:在源码中,我们可以看到 Pig 如何构建逻辑计划(Logical Plan)和物理计划(Physical Plan),这是将高级操作转化为低级数据流操作的关键步骤。 4. **Operators**:Pig 提供了...

    pig基础操作

    对于“源码”,理解 Pig 的工作原理可能需要查看其内部代码,这有助于开发者定制功能或优化性能。而“工具”则强调了 Pig 是一个实用的开发工具,它简化了大数据处理的复杂性,使用户能够专注于业务逻辑而不是底层...

    hadoop_hbase_pig

    Pig提供了一种抽象层,降低了编写大数据处理程序的复杂度,使得数据科学家和分析师能够更专注于业务逻辑,而不是底层的分布式计算细节。 文件列表中的"hbase.txt"可能包含了HBase的安装指南、配置参数、操作命令或...

    log4j-pig-master.zip

    源码分析将帮助我们理解这些优化策略。 7. **Pig运行环境**: Pig可以在多种环境中运行,包括本地模式、Hadoop分布式模式等。通过源码,我们可以了解Pig如何适应不同的运行环境,以及如何与Hadoop生态系统中的其他...

    pig权限管理系统 v2.10.2.zip

    本文将围绕其功能特性、设计理念以及源码分析等方面进行详细阐述。 首先,"pig权限管理系统"是一款基于角色的权限控制(Role-Based Access Control, RBAC)模型的系统。RBAC模型通过定义角色和权限的关系,实现用户...

    Hadoop权威指南原版和源码

    这种模型使得开发者可以专注于编写业务逻辑,而无需关心分布式执行的细节。 3. **Hadoop源码分析**:通过阅读Hadoop的源码,我们可以了解到其内部的工作流程、数据流向以及错误处理机制等。例如,可以研究NameNode...

    ETL 开发相关

    - 性能优化:考虑并行处理、数据分区、缓存等技术来提升ETL效率。 - 容错与重试机制:设计合理的错误处理策略,确保ETL任务的稳定性。 - 日志与监控:记录详细的ETL执行日志,设置性能指标监控,以便于问题排查和...

    hadoop-3.1.2-src.tar.gz

    1. 性能优化:Hadoop 3.1.2在性能上进行了诸多优化,如提升NameNode的元数据处理能力,减少数据传输的网络开销,支持更高效的Block副本策略等。开发者可以通过源码学习到这些优化策略,为自己的应用定制更高效的解决...

    Cloudera Hive 文档

    执行引擎负责解析、优化和执行查询计划。 2. **HQL(Hive Query Language)**:HQL 是 Hive 的查询语言,它借鉴了 SQL 的语法,支持 SELECT、FROM、WHERE、GROUP BY、JOIN 等子句,但并不完全兼容 SQL。HQL 查询被...

    apache-hive-1.2.1-src.zip

    源码中的 `optimizer` 目录包含了相关的算法和逻辑。 10. **数据倾斜处理**: Hive 还提供了处理数据倾斜的策略,例如动态分区和负载均衡。 通过阅读和分析 `apache-hive-1.2.1-src` 中的源码,开发者可以深入理解 ...

    hive分区导入

    1. **SQL性能优化之Toad for Oracle分析与调优.doc**:这可能是一个关于Oracle数据库性能优化的文档,Toad是常用的Oracle数据库管理工具,提供了查询分析和性能优化的功能,对于理解SQL执行效率有帮助,虽然不是直接...

    基于hadoop,hbase的youtube简单模拟项目源码

    7. **数据流处理**:可能使用Hadoop的其他工具,如Pig或Hive,来进行复杂的数据分析和报表生成。这些工具简化了对Hadoop集群的数据操作,使非程序员也能处理大数据。 8. **监控与优化**:项目实施过程中,还需要...

    大数据开发随书源码,hadoop系列

    Pig,一个高级的数据流语言和执行框架,用于处理大规模数据集;HBase,一个非关系型的分布式数据库,用于存储结构化数据;ZooKeeper,一个协调服务,用于维护配置信息、命名、提供分布式同步等功能。 在使用Hadoop...

    《月下情人》动画程序

    源码是理解程序工作原理的基础,通过分析源码,开发者可以学习到程序的设计思路和算法实现。 3. **多媒体资源**:Pig.bmp、Ground.bmp等.bmp格式的文件是位图图像资源,它们提供了动画中的静态背景或角色图像。位图...

    Hadoop权威指南中文版和源码

    总之,《Hadoop权威指南》中文版和源码是一份宝贵的教育资源,它不仅帮助你理解和掌握Hadoop的基础知识,还引导你进入大数据的世界,探索更多可能的数据分析和处理方法。通过深入学习,你将成为一个熟练的Hadoop...

    mapper-reduce

    这里的“源码”标签暗示我们需要关注如何实现和优化这两个组件的代码。开发者通常会使用Hadoop的Java API来编写Mapper和Reducer,但也有一些其他的编程语言支持,如Python和Scala。 `工具`标签则意味着我们还需要...

    大数据Windows下虚拟机内部Hadoop的安装使用

    至于“开发新的数据算法”,Hadoop提供了丰富的API和工具,如Pig、Hive、Spark等,可以用于处理和分析大数据。你可以在Java、Python或其他支持的语言中编写MapReduce程序,实现自己的数据处理逻辑。 总结来说,本...

Global site tag (gtag.js) - Google Analytics