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/02/11 17:26:41 UTC
svn commit: r1567207 -
/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
Author: hashutosh
Date: Tue Feb 11 16:26:41 2014
New Revision: 1567207
URL: http://svn.apache.org/r1567207
Log:
HIVE-6288 : MSCK can be slow when adding partitions (Sergey Shelukhin via Ashutosh Chauhan)
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java?rev=1567207&r1=1567206&r2=1567207&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java Tue Feb 11 16:26:41 2014
@@ -1837,6 +1837,19 @@ public class DDLTask extends Task<DDLWor
}
}
+ private void msckAddPartitionsOneByOne(Hive db, Table table,
+ List<CheckResult.PartitionResult> partsNotInMs, List<String> repairOutput) {
+ for (CheckResult.PartitionResult part : partsNotInMs) {
+ try {
+ db.createPartition(table, Warehouse.makeSpecFromName(part.getPartitionName()));
+ repairOutput.add("Repair: Added partition to metastore "
+ + table.getTableName() + ':' + part.getPartitionName());
+ } catch (Exception e) {
+ LOG.warn("Repair error, could not add partition to metastore: ", e);
+ }
+ }
+ }
+
/**
* MetastoreCheck, see if the data in the metastore matches what is on the
* dfs. Current version checks for tables and partitions that are either
@@ -1855,17 +1868,22 @@ public class DDLTask extends Task<DDLWor
HiveMetaStoreChecker checker = new HiveMetaStoreChecker(db);
Table t = db.newTable(msckDesc.getTableName());
checker.checkMetastore(t.getDbName(), t.getTableName(), msckDesc.getPartSpecs(), result);
- if (msckDesc.isRepairPartitions()) {
+ List<CheckResult.PartitionResult> partsNotInMs = result.getPartitionsNotInMs();
+ if (msckDesc.isRepairPartitions() && !partsNotInMs.isEmpty()) {
Table table = db.getTable(msckDesc.getTableName());
- for (CheckResult.PartitionResult part : result.getPartitionsNotInMs()) {
- try {
- db.createPartition(table, Warehouse.makeSpecFromName(part
- .getPartitionName()));
+ AddPartitionDesc apd = new AddPartitionDesc(
+ table.getDbName(), table.getTableName(), false);
+ try {
+ for (CheckResult.PartitionResult part : partsNotInMs) {
+ apd.addPartition(Warehouse.makeSpecFromName(part.getPartitionName()), null);
repairOutput.add("Repair: Added partition to metastore "
+ msckDesc.getTableName() + ':' + part.getPartitionName());
- } catch (Exception e) {
- LOG.warn("Repair error, could not add partition to metastore: ", e);
}
+ db.createPartitions(apd);
+ } catch (Exception e) {
+ LOG.info("Could not bulk-add partitions to metastore; trying one by one", e);
+ repairOutput.clear();
+ msckAddPartitionsOneByOne(db, table, partsNotInMs, repairOutput);
}
}
} catch (HiveException e) {