You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/08/12 22:07:00 UTC

svn commit: r1617575 - in /hive/branches/cbo: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Author: hashutosh
Date: Tue Aug 12 20:06:59 2014
New Revision: 1617575

URL: http://svn.apache.org/r1617575
Log:
HIVE-7687 : Invoke cbo only when needed (Ashutosh Chauhan via John Pullokkran)

Modified:
    hive/branches/cbo/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/branches/cbo/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java?rev=1617575&r1=1617574&r2=1617575&view=diff
==============================================================================
--- hive/branches/cbo/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (original)
+++ hive/branches/cbo/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java Tue Aug 12 20:06:59 2014
@@ -611,9 +611,6 @@ public class HiveConf extends Configurat
 
     // CBO related
     HIVE_CBO_ENABLED("hive.cbo.enable", false, "Flag to control enabling Cost Based Optimizations using Optiq framework."),
-    HIVE_CBO_MAX_JOINS_SUPPORTED("hive.cbo.max.joins.supported", 10, " Control queries that will be considered for join reordering, based on number of joins in them. Beyond a certain number of joins, the cost of considering possible permutations is prohibitive."),
-    HIVE_CBO_PULLPROJECTABOVEJOIN_RULE("hive.cbo.project.pullabovejoin.rule", false, ""),
-    HIVE_CBO_GREEDY_JOIN_ORDER("hive.cbo.greedy.join.order", false, ""),
 
     // hive.mapjoin.bucket.cache.size has been replaced by hive.smbjoin.cache.row,
     // need to remove by hive .13. Also, do not change default (see SMB operator)

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1617575&r1=1617574&r2=1617575&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Tue Aug 12 20:06:59 2014
@@ -11766,8 +11766,7 @@ public class SemanticAnalyzer extends Ba
   private boolean canHandleQuery() {
     boolean runOptiqPlanner = false;
 
-    if ((queryProperties.getJoinCount() < HiveConf.getIntVar(conf,
-        HiveConf.ConfVars.HIVE_CBO_MAX_JOINS_SUPPORTED))
+    if ((queryProperties.getJoinCount() > 1)
         && !queryProperties.hasClusterBy()
         && !queryProperties.hasDistributeBy()
         && !queryProperties.hasSortBy()
@@ -11840,56 +11839,27 @@ public class SemanticAnalyzer extends Ba
       List<RelMetadataProvider> list = Lists.newArrayList();
       list.add(HiveDefaultRelMetadataProvider.INSTANCE);
       RelTraitSet desiredTraits = cluster.traitSetOf(HiveRel.CONVENTION, RelCollationImpl.EMPTY);
-      final boolean bushy = RelOptUtil.countJoins(optiqPreCboPlan) > 3 ? true : false;
 
-      if (!bushy) {
-        planner.registerMetadataProviders(list);
+      HepProgram hepPgm = null;
+      HepProgramBuilder hepPgmBldr = new HepProgramBuilder().addMatchOrder(
+        HepMatchOrder.BOTTOM_UP).addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class));
+        hepPgmBldr.addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY));
 
-        RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list);
-        cluster.setMetadataProvider(new CachingRelMetadataProvider(chainedProvider, planner));
+      hepPgm = hepPgmBldr.build();
+      HepPlanner hepPlanner = new HepPlanner(hepPgm);
 
-        planner.addRule(HiveSwapJoinRule.INSTANCE);
-        planner.addRule(HivePushJoinThroughJoinRule.LEFT);
-        planner.addRule(HivePushJoinThroughJoinRule.RIGHT);
-        if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_PULLPROJECTABOVEJOIN_RULE)) {
-          planner.addRule(HivePullUpProjectsAboveJoinRule.BOTH_PROJECT);
-          planner.addRule(HivePullUpProjectsAboveJoinRule.LEFT_PROJECT);
-          planner.addRule(HivePullUpProjectsAboveJoinRule.RIGHT_PROJECT);
-          planner.addRule(HiveMergeProjectRule.INSTANCE);
-        }
-
-        RelNode rootRel = optiqPreCboPlan;
-        if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) {
-          rootRel = planner.changeTraits(optiqPreCboPlan, desiredTraits);
-        }
-        planner.setRoot(rootRel);
-
-        optiqOptimizedPlan = planner.findBestExp();
-      } else {
-        HepProgram hepPgm = null;
-        HepProgramBuilder hepPgmBldr = new HepProgramBuilder().addMatchOrder(
-            HepMatchOrder.BOTTOM_UP).addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class));
-        if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_GREEDY_JOIN_ORDER)) {
-          hepPgmBldr.addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY));
-        } else {
-          hepPgmBldr.addRuleInstance(new OptimizeBushyJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY,
-              HiveProjectRel.DEFAULT_PROJECT_FACTORY));
-        }
-        hepPgm = hepPgmBldr.build();
-        HepPlanner hepPlanner = new HepPlanner(hepPgm);
+      hepPlanner.registerMetadataProviders(list);
+      RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list);
+      cluster.setMetadataProvider(new CachingRelMetadataProvider(chainedProvider, hepPlanner));
 
-        hepPlanner.registerMetadataProviders(list);
-        RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list);
-        cluster.setMetadataProvider(new CachingRelMetadataProvider(chainedProvider, hepPlanner));
+      RelNode rootRel = optiqPreCboPlan;
+      if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) {
+        rootRel = hepPlanner.changeTraits(optiqPreCboPlan, desiredTraits);
+      }
+      hepPlanner.setRoot(rootRel);
 
-        RelNode rootRel = optiqPreCboPlan;
-        if (!optiqPreCboPlan.getTraitSet().equals(desiredTraits)) {
-          rootRel = hepPlanner.changeTraits(optiqPreCboPlan, desiredTraits);
-        }
-        hepPlanner.setRoot(rootRel);
+      optiqOptimizedPlan = hepPlanner.findBestExp();
 
-        optiqOptimizedPlan = hepPlanner.findBestExp();
-      }
 
       if (LOG.isDebugEnabled()) {
         LOG.debug("CBO Planning details:\n");