Pig系统分析(4)-Logical Plan Optimizer

来源:互联网 发布:学c语言好还是java好 编辑:程序博客网 时间:2024/06/05 16:02

优化过程

Pig哲学之二——Pigs Are Domestic Animals。用户拥有足够的控制权。具体到逻辑执行计划的优化上,用户可以根据自己情况选择适合的优化规则(也可以理解为优化这块还大有潜力可挖)。

逻辑执行计划在编译成物理执行计划之前,会被LogicalPlanOptimizer处理,和一系列优化规则进行匹配,匹配上的优化规则会对原有执行计划进行变换,最终产生优化后的新执行计划。整个过程如图所示:



Pig的逻辑优化器通过简化、合并、插入和调整逻辑执行计划中LogicalRelationalOperator的顺序等变换操作达到优化目的。下文逐个介绍每个优化规则。

基于规则的优化器

PartitionFilterOptimizer

将分区过滤条件下推到Loader(需要Loader支持,比如HCatLoader支持分区字段推送,请参考之前介绍的LoadMetadata接口)

FilterLogicExpressionSimplifier

简化filter语句中的逻辑条件表达式,其中规则较多,委托给LogicalExpressionProxy进行处理:常量计算,根据摩根定律变换and/or操作和使用DNF标准化逻辑公式等。

SplitFilter

将filter语句中的条件分割,以便让他们分别下推。比如:

A = LOAD 'input1' as (a0, a1);B = LOAD 'input2' as (b0, b1);C = JOIN A by a0, B by b0;D = FILTER C BY a1>0 and b1>0;
D中对a和b的过滤条件可以分割开,以便于这两个过滤条件能够分别被下推。

X = FILTER C BY a1>0;D = FILTER X BY b1>0;

PushUpFilter

将过滤条件下推(沿着数据流DAG图上推),减少数据传输量

FilterAboveForeach

从foreach语句中移除与之前操作重复的过滤条件

ImplicitSplitInserter

插入split语句,(原因详见下文“其他优化”中split部分)

MergeFilter

在PushUpFilter之后,合并过滤条件,减少filter语句

PushDownForEachFlatten

将foreach中的flatten往后放(沿着数据流DAG图下推),能够减少后续join等操作的数据量。因为如果flatten对bag操作,一条记录会生成多条记录,降低后续join操作的性能,优化后,会将flatten操作放在join操作之后。

LimitOptimizer

Limit语句下推,尽早减少数据传输量。

ColumnMapKeyPrune

裁剪不必要的加载列。需要Loader支持,否则,会在Load语句之后增加一个foreach语句来进行处理。

用到的辅助类:ColumnPruneVisitor和ColumnPruneHelper

AddForEach

裁剪后续不会被用到的列,比如某个列在某个语句之后没有被用到,会在这条语句之后增加一个foreach语句进行裁剪。

MergeForEach

将多个连续的foreach语句合并成一个

GroupByConstParallelSetter

一些Group语句,比如group all,或者group的字段是常量,这种情况下,不能使用多个reduce并行,那么 parallel参数会被设置成1。

其他优化

Multi-query execution

在之前的例子中,严格来讲,执行计划都是树形结构,即多个操作最终产生一个结果,在显示使用Split语句或者逻辑执行计划被前文提到的ImplicitSplitInserter优化后,一个操作会产生多个输出结果。

SPLIT A INTO B IF ..., C IF .

在这种情况下,Pig将A的数据同时通过两个管道生成B和C数据,即Multi-query execution。优点是只用加载一次数据A,付出的代价是会占用更多的内存,如果内存不够,数据需要写入磁盘的话,性能反而会降低。

Combiner

Pig利用Hadoop的Combiner机制减少map和reduce之间的数据传输量。比如在下面的foreach语句中,字段是分组键,表达式使用的函数符合algebraic性质,都会应用Combiner。

pigServer.registerQuery("E = group D by z;");pigServer.registerQuery("F = foreach E generate group,COUNT(D);");
algebraic性质请参考:

Data Cube: ARelational Aggregation Operator Generalizing Group-By, Cross-Tab, andSub-Totals

Join

Pig支持多种join实现方式。同样因为Pig不支持基于成本优化器,所以控制权依然交给了用户,需要在在join语句中使用replicated/merge/merge-sparse/skewed关键词选择不同的join策略。前三种Join实现只针对特定的场景,所以不在此展开。而在现实世界中,数据倾斜现象经常发生,所以介绍一下Pig针对数据倾斜所做的优化。

Join操作需要将key相同的数据放在一起处理,当出现数据倾斜时,某个节点处理大部分数据,会极大地拖慢整个任务的完成时间。Pig的解决思路是:先对数据进行取样,识别出数据倾斜严重的Key值,针对正常分布的数据,进行正常的Join操作,这部分数据倾斜的Key值则分发到多个节点上进行join操作。以上过程实现请参考Pig提供的SkewedPartitioner。

Pig的skewed join算法仅适用于参与join操作一方出现数据倾斜的场景。

0 0
原创粉丝点击