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不分析了。
全文完 :)
分享到:
相关推荐
pig0.15源码,适合小白学习大数据参考和使用
pig源码包,最好的学习资料还是源码包。里边包括核心包,以及其他贡献的包,pigunit,还有源码
PIG(国内微服务热度最高的一个社区)
Pig Latin: A Not-So-Foreign Language for Data Processing
PigLatin表达式操作的是relation,FILTER、FOREACH、GROUP、SPLIT等关系操作符所操作的relation就是bag,bag为tuple的集合,tuple为有序的field列表集合,而field表示数据块(Afieldisapieceofdata),可理解为数据...
PersonalWebsiteauthorLixingchen:unicorn:IELTSGetStarted:unicorn:使用react,ts 构建大型应用程序项目功能正在持续更新, 欢迎大家学习探讨:trophy:技术点 technology:trophy:TypeScriptReact ...pig_face::pig_face:
pig编程指南中所用到的例子什么的,自己从github下载的,大家有需要的可以下一下
pig-config:学习码云上的开源项目pig
:sparkles: :pig_face: :sparkles: 。 。 目录 你好! 或解析表达语法,使用规则描述一种编程语言。 用人类的话来说,它是用于解析编程语言的。 Peppa PEG是ANSI C中的超轻量级PEG分析器。 警告:Peppa PEG尚未...
Apache Pig的性能优化.pdf
海猪 :water_wave: :pig_face:海猪代表(C承运P ROPS我nternalģ埃特),除了C是音素拼写。目录 seapig seapig 做seapig做什么! seapig在这里可以帮助您以一致且灵活的方式seapig React组件。 它提供了一种将组成...
猪-json 用于 Apache Pig 的 Mortar JSON 工具。... 使用 pig-json 优于 Pig 的内置 JsonStorage 的好处是 pig-json 读取任意 JSON 数据而无需元数据文件,而 Pig 内置的 JsonStorage 只能读取它使
松露猪 :mushroom: :pig_face: TrufflePig是一个开发工具,它提供了一个简单的HTTP API来查找和读取生成的合同文件,以便在本地开发期间使用。安装全局安装: $ yarn global add trufflepig 或作为对松露项目的...
与我们心爱的人互动的命令行界面 :pig_face: BOT。 安装程序 0. Python 平均控制版本和Python版本 :snake: 兼容,高级3.8或以上。 根据控件esegui python3 --version nel terminale。 1.安装命令 伊尔COMANDO SI ...
团子 搜索表情符号 :pizza: :face_savoring_food: :smiling_face_with_heart-eyes: :pig_face: 。安装$ npm install --save dango用法import dango from 'dango' ;dango ( 'pizza' ) . then ( items => { console . ...
追踪你的 :dollar_banknote: , :nine_o’clock: , :pig: , :cow: , :clinking_beer_mugs: 在您的命令行上。功能/待办事项清单 以交易为模型,而不是借记/贷记帐户=>支持由多个转账组成的复杂交易 专用付款人...
Beginning Apache Pig: Big Data Processing Made Easy English | 29 Dec. 2016 | ISBN: 1484223365 | 300 Pages | PDF | 4.9 MB Learn to use Apache Pig to develop lightweight big data applications easily ...
pig-game:我的项目的新存储库
:pig_face: placepic:可爱的小猫服务器 SOPT第26届APPJAM-团队地标项目期限:2020.06.28〜2020.07.18 :film_frames: 工作流程 :round_pushpin: 地标服务Placepick,我们最喜欢的地方Placepick是一个受信任的基于...