Revert "HIVE-19171 : Persist runtime statistics in metastore (Zoltan Haindrich via Ashutosh Chauhan)"
This reverts commit b3e2d8a05f57a91b12b8347b2763a296c3480d97. Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/f0199500 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/f0199500 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/f0199500 Branch: refs/heads/storage-branch-2.6 Commit: f0199500f00ae58cf1a9f73f5baebdc5d5eca417 Parents: 997ad34 Author: Prasanth Jayachandran <prasan...@apache.org> Authored: Mon Apr 23 15:07:41 2018 -0700 Committer: Prasanth Jayachandran <prasan...@apache.org> Committed: Mon Apr 23 15:07:41 2018 -0700 ---------------------------------------------------------------------- .../org/apache/hadoop/hive/conf/HiveConf.java | 6 +- .../listener/DummyRawStoreFailEvent.java | 19 - .../org/apache/hadoop/hive/ql/QTestUtil.java | 2 +- .../upgrade/derby/056-HIVE-19171.derby.sql | 10 - .../ql/optimizer/signature/OpSignature.java | 19 +- .../ql/optimizer/signature/OpTreeSignature.java | 24 +- .../signature/OpTreeSignatureFactory.java | 12 +- .../ql/optimizer/signature/RuntimeStatsMap.java | 83 - .../signature/RuntimeStatsPersister.java | 54 - .../ql/optimizer/signature/SignatureUtils.java | 22 +- .../hadoop/hive/ql/plan/FileSinkDesc.java | 7 +- .../hadoop/hive/ql/plan/HashTableSinkDesc.java | 6 +- .../apache/hadoop/hive/ql/plan/JoinDesc.java | 6 +- .../apache/hadoop/hive/ql/plan/MapJoinDesc.java | 6 +- .../hive/ql/plan/mapper/CachingStatsSource.java | 7 +- .../hive/ql/plan/mapper/EmptyStatsSource.java | 2 +- .../ql/plan/mapper/MetastoreStatsConnector.java | 143 - .../hadoop/hive/ql/plan/mapper/PlanMapper.java | 108 +- .../plan/mapper/SimpleRuntimeStatsSource.java | 37 +- .../hive/ql/plan/mapper/StatsSources.java | 86 +- .../hadoop/hive/ql/reexec/ReOptimizePlugin.java | 17 +- .../hadoop/hive/ql/stats/OperatorStats.java | 33 +- .../signature/TestRuntimeStatsPersistence.java | 165 - .../ql/plan/mapping/TestCounterMapping.java | 7 +- .../ql/plan/mapping/TestReOptimization.java | 85 +- .../apache/hive/service/server/HiveServer2.java | 3 - .../gen/thrift/gen-cpp/ThriftHiveMetastore.cpp | 5376 ++++++++---------- .../gen/thrift/gen-cpp/ThriftHiveMetastore.h | 259 - .../ThriftHiveMetastore_server.skeleton.cpp | 10 - .../gen/thrift/gen-cpp/hive_metastore_types.cpp | 376 +- .../gen/thrift/gen-cpp/hive_metastore_types.h | 97 - .../metastore/api/GetRuntimeStatsRequest.java | 283 - .../hadoop/hive/metastore/api/RuntimeStat.java | 600 -- .../hive/metastore/api/ThriftHiveMetastore.java | 2584 ++------- .../gen-php/metastore/ThriftHiveMetastore.php | 481 -- .../src/gen/thrift/gen-php/metastore/Types.php | 171 - .../hive_metastore/ThriftHiveMetastore-remote | 14 - .../hive_metastore/ThriftHiveMetastore.py | 409 -- .../gen/thrift/gen-py/hive_metastore/ttypes.py | 141 - .../gen/thrift/gen-rb/hive_metastore_types.rb | 37 - .../gen/thrift/gen-rb/thrift_hive_metastore.rb | 119 - .../hadoop/hive/metastore/HiveMetaStore.java | 113 +- .../hive/metastore/HiveMetaStoreClient.java | 140 +- .../hadoop/hive/metastore/IMetaStoreClient.java | 9 - .../hadoop/hive/metastore/ObjectStore.java | 248 +- .../apache/hadoop/hive/metastore/RawStore.java | 15 +- .../hive/metastore/RuntimeStatsCleanerTask.java | 67 - .../hive/metastore/cache/CachedStore.java | 21 +- .../hive/metastore/conf/MetastoreConf.java | 34 +- .../hive/metastore/model/MRuntimeStat.java | 59 - .../src/main/resources/package.jdo | 14 - .../main/sql/derby/hive-schema-3.0.0.derby.sql | 10 - .../sql/derby/upgrade-2.3.0-to-3.0.0.derby.sql | 10 - .../main/sql/mssql/hive-schema-3.0.0.mssql.sql | 9 - .../sql/mssql/upgrade-2.3.0-to-3.0.0.mssql.sql | 9 - .../main/sql/mysql/hive-schema-3.0.0.mysql.sql | 10 - .../sql/mysql/upgrade-2.3.0-to-3.0.0.mysql.sql | 9 - .../sql/oracle/hive-schema-3.0.0.oracle.sql | 10 - .../oracle/upgrade-2.3.0-to-3.0.0.oracle.sql | 9 - .../sql/postgres/hive-schema-3.0.0.postgres.sql | 11 - .../upgrade-2.3.0-to-3.0.0.postgres.sql | 9 - .../src/main/thrift/hive_metastore.thrift | 12 - .../DummyRawStoreControlledCommit.java | 18 - .../DummyRawStoreForJdoConnection.java | 17 - .../HiveMetaStoreClientPreCatalog.java | 10 - .../hive/metastore/client/TestRuntimeStats.java | 100 - 66 files changed, 2963 insertions(+), 9936 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java ---------------------------------------------------------------------- diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index f40c606..2403d7a 100644 --- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -4270,15 +4270,15 @@ public class HiveConf extends Configuration { new StringSet("query", "hiveserver", "metastore"), "Sets the persistence scope of runtime statistics\n" + " query: runtime statistics are only used during re-execution\n" - + " hiveserver: runtime statistics are persisted in the hiveserver - all sessions share it\n" - + " metastore: runtime statistics are persisted in the metastore as well"), + + " hiveserver: runtime statistics are persisted in the hiveserver - all sessions share it"), HIVE_QUERY_MAX_REEXECUTION_COUNT("hive.query.reexecution.max.count", 1, "Maximum number of re-executions for a single query."), HIVE_QUERY_REEXECUTION_ALWAYS_COLLECT_OPERATOR_STATS("hive.query.reexecution.always.collect.operator.stats", false, "If sessionstats are enabled; this option can be used to collect statistics all the time"), HIVE_QUERY_REEXECUTION_STATS_CACHE_SIZE("hive.query.reexecution.stats.cache.size", 100_000, - "Size of the runtime statistics cache. Unit is: OperatorStat entry; a query plan consist ~100. See also: runtime.stats.max.entries"), + "Size of the runtime statistics cache. Unit is: OperatorStat entry; a query plan consist ~100"), + HIVE_QUERY_RESULTS_CACHE_ENABLED("hive.query.results.cache.enabled", true, "If the query results cache is enabled. This will keep results of previously executed queries " + http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java ---------------------------------------------------------------------- diff --git a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java index 8ecbaad..801de7a 100644 --- a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java +++ b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java @@ -69,7 +69,6 @@ import org.apache.hadoop.hive.metastore.api.WMTrigger; import org.apache.hadoop.hive.metastore.api.WMValidateResourcePlanResponse; import org.apache.hadoop.hive.metastore.api.Role; import org.apache.hadoop.hive.metastore.api.RolePrincipalGrant; -import org.apache.hadoop.hive.metastore.api.RuntimeStat; import org.apache.hadoop.hive.metastore.api.SQLCheckConstraint; import org.apache.hadoop.hive.metastore.api.SQLDefaultConstraint; import org.apache.hadoop.hive.metastore.api.SQLForeignKey; @@ -296,7 +295,6 @@ public class DummyRawStoreFailEvent implements RawStore, Configurable { objectStore.updateCreationMetadata(catName, dbname, tablename, cm); } - @Override public void alterTable(String catName, String dbName, String name, Table newTable) throws InvalidObjectException, MetaException { if (shouldEventSucceed) { @@ -1128,7 +1126,6 @@ public class DummyRawStoreFailEvent implements RawStore, Configurable { return null; } - @Override public void createISchema(ISchema schema) throws AlreadyExistsException, MetaException, NoSuchObjectException { objectStore.createISchema(schema); @@ -1198,20 +1195,4 @@ public class DummyRawStoreFailEvent implements RawStore, Configurable { public void addSerde(SerDeInfo serde) throws AlreadyExistsException, MetaException { objectStore.addSerde(serde); } - - @Override - public void addRuntimeStat(RuntimeStat stat) throws MetaException { - objectStore.addRuntimeStat(stat); - } - - @Override - public List<RuntimeStat> getRuntimeStats() throws MetaException { - return objectStore.getRuntimeStats(); - } - - @Override - public int deleteRuntimeStats(int maxRetained, int maxRetainSecs) { - return 0; - } - } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java ---------------------------------------------------------------------- diff --git a/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java b/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java index 750fc69..88022be 100644 --- a/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java +++ b/itests/util/src/main/java/org/apache/hadoop/hive/ql/QTestUtil.java @@ -1067,7 +1067,7 @@ public class QTestUtil { clearTablesCreatedDuringTests(); clearUDFsCreatedDuringTests(); clearKeysCreatedInTests(); - StatsSources.clearGlobalStats(); + StatsSources.clearAllStats(); } protected void clearSettingsCreatedInTests() throws IOException { http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/metastore/scripts/upgrade/derby/056-HIVE-19171.derby.sql ---------------------------------------------------------------------- diff --git a/metastore/scripts/upgrade/derby/056-HIVE-19171.derby.sql b/metastore/scripts/upgrade/derby/056-HIVE-19171.derby.sql deleted file mode 100644 index ef6c77b..0000000 --- a/metastore/scripts/upgrade/derby/056-HIVE-19171.derby.sql +++ /dev/null @@ -1,10 +0,0 @@ - - -CREATE TABLE "APP"."RUNTIME_STATS" ( - "RS_ID" bigint primary key, - "CREATE_TIME" integer not null, - "WEIGHT" integer not null, - "PAYLOAD" BLOB -); - -CREATE INDEX IDX_RUNTIME_STATS_CREATE_TIME ON RUNTIME_STATS(CREATE_TIME); http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpSignature.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpSignature.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpSignature.java index f626bd5..e87bbce 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpSignature.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpSignature.java @@ -25,28 +25,18 @@ import java.util.Map.Entry; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.plan.OperatorDesc; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; import com.google.common.annotations.VisibleForTesting; /** * Signature of the operator(non-recursive). */ -@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") -public final class OpSignature { +public class OpSignature { /** * Holds the signature of the operator; the keys are are the methods name marked by {@link Signature}. */ - @JsonProperty private Map<String, Object> sigMap; - // need this for Jackson to work - @SuppressWarnings("unused") - private OpSignature() { - } - private OpSignature(Operator<? extends OperatorDesc> op) { sigMap = new HashMap<>(); // FIXME: consider other operator info as well..not just conf? @@ -80,7 +70,7 @@ public final class OpSignature { @VisibleForTesting public void proveEquals(OpSignature other) { - proveEquals(sigMap, other.sigMap); + proveEquals(sigMap,other.sigMap); } private static void proveEquals(Map<String, Object> m1, Map<String, Object> m2) { @@ -113,9 +103,4 @@ public final class OpSignature { } return sb.toString(); } - - public Map<String, Object> getSigMap() { - return sigMap; - } - } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignature.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignature.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignature.java index f774158..c3dc848 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignature.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignature.java @@ -24,28 +24,14 @@ import java.util.Objects; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.plan.OperatorDesc; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; - /** * Operator tree signature. */ -@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") -public final class OpTreeSignature { - - @JsonProperty +public class OpTreeSignature { private int hashCode; - @JsonProperty private OpSignature sig; - @JsonProperty private ArrayList<OpTreeSignature> parentSig; - // need this for Jackson to work - @SuppressWarnings("unused") - private OpTreeSignature() { - } - OpTreeSignature(Operator<?> op, OpTreeSignatureFactory osf) { sig = OpSignature.of(op); parentSig = new ArrayList<>(); @@ -96,12 +82,4 @@ public final class OpTreeSignature { return sb.toString(); } - public OpSignature getSig() { - return sig; - } - - public ArrayList<OpTreeSignature> getParentSig() { - return parentSig; - } - } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignatureFactory.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignatureFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignatureFactory.java index 80a3edf..3df5ee9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignatureFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/OpTreeSignatureFactory.java @@ -29,22 +29,22 @@ import org.apache.hadoop.hive.ql.plan.OperatorDesc; */ public interface OpTreeSignatureFactory { - OpTreeSignature getSignature(Operator<? extends OperatorDesc> op); + public OpTreeSignature getSignature(Operator<? extends OperatorDesc> op); - OpTreeSignatureFactory DIRECT = new Direct(); + static final OpTreeSignatureFactory DIRECT = new Direct(); - static OpTreeSignatureFactory direct() { + public static OpTreeSignatureFactory direct() { return DIRECT; } - static OpTreeSignatureFactory newCache() { + public static OpTreeSignatureFactory newCache() { return new CachedFactory(); } // FIXME: possible alternative: move both OpSignature/OpTreeSignature into // under some class as nested ones; and that way this factory level caching can be made "transparent" - class Direct implements OpTreeSignatureFactory { + static class Direct implements OpTreeSignatureFactory { @Override public OpTreeSignature getSignature(Operator<? extends OperatorDesc> op) { @@ -53,7 +53,7 @@ public interface OpTreeSignatureFactory { } - class CachedFactory implements OpTreeSignatureFactory { + static class CachedFactory implements OpTreeSignatureFactory { Map<Operator<? extends OperatorDesc>, OpTreeSignature> cache = new IdentityHashMap<>(); http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsMap.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsMap.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsMap.java deleted file mode 100644 index 195a8b1..0000000 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsMap.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hive.ql.optimizer.signature; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.hadoop.hive.ql.stats.OperatorStats; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Objects; - -/** - * This class makes it easier for jackson to comprehend the map type - * - * Instead of getting into convincing Jackson to store the map with serializers and typefactory tricks; - * this class is a simple "repacker" to and from list. - */ -public final class RuntimeStatsMap { - @JsonProperty - private List<OpTreeSignature> sigs; - @JsonProperty - private List<OperatorStats> ss; - - RuntimeStatsMap() { - } - - - public RuntimeStatsMap(Map<OpTreeSignature, OperatorStats> input) { - sigs = new ArrayList<>(input.size()); - ss = new ArrayList<>(input.size()); - for (Entry<OpTreeSignature, OperatorStats> ent : input.entrySet()) { - sigs.add(ent.getKey()); - ss.add(ent.getValue()); - } - } - - public Map<OpTreeSignature, OperatorStats> toMap() throws IOException { - if (sigs.size() != ss.size()) { - throw new IOException("constraint validation"); - } - Map<OpTreeSignature, OperatorStats> ret = new HashMap<>(); - for (int i = 0; i < sigs.size(); i++) { - ret.put(sigs.get(i), ss.get(i)); - } - return ret; - } - - @Override - public int hashCode() { - return Objects.hashCode(sigs, ss); - } - - @Override - public boolean equals(Object obj) { - if (obj == null || obj.getClass() != RuntimeStatsMap.class) { - return false; - } - RuntimeStatsMap o = (RuntimeStatsMap) obj; - return Objects.equal(sigs, o.sigs) && - Objects.equal(ss, o.ss); - } -} http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsPersister.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsPersister.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsPersister.java deleted file mode 100644 index 696fe1f..0000000 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/RuntimeStatsPersister.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hive.ql.optimizer.signature; - -import java.io.IOException; - -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; - -/** - * Enables to encode/decode runtime statistics values into textual form. - */ -public class RuntimeStatsPersister { - public static final RuntimeStatsPersister INSTANCE = new RuntimeStatsPersister(); - - private final ObjectMapper om; - - RuntimeStatsPersister() { - om = new ObjectMapper(); - om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); - om.configure(SerializationFeature.INDENT_OUTPUT, true); - om.configure(MapperFeature.REQUIRE_SETTERS_FOR_GETTERS, true); - } - - public <T> String encode(T input) throws IOException { - return om.writeValueAsString(input); - } - - public <T> T decode(String input, Class<T> clazz) throws IOException { - return om.readValue(input, clazz); - } - - public <T> T decode(byte[] input, Class<T> clazz) throws IOException { - return om.readValue(input, clazz); - } - -} http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/SignatureUtils.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/SignatureUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/SignatureUtils.java index f599d33..4f3e338 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/SignatureUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/signature/SignatureUtils.java @@ -23,15 +23,17 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import com.google.common.collect.Sets; /** * Enables to calculate the signature of an object. * * If the object has methods annotated with {@link Signature}, they will be used. - * If the object has no methods marked with the annotation; - * the object itself is used in the signature to prevent incorrect matches. + * If the object has no methods marked with the annotation; the object itself is used in the signature to prevent incorrect matches. */ -public final class SignatureUtils { +public class SignatureUtils { private static Map<Class<?>, SignatureMapper> mappers = new HashMap<>(); @@ -40,24 +42,28 @@ public final class SignatureUtils { mapper.write(ret, o); } - /** Prevent construction. */ - private SignatureUtils() { - } - static class SignatureMapper { + static final Set<String> acceptedSignatureTypes = Sets.newHashSet(); + private List<Method> sigMethods; private String classLabel; - SignatureMapper(Class<?> o) { + public SignatureMapper(Class<?> o) { Method[] f = o.getMethods(); sigMethods = new ArrayList<>(); for (Method method : f) { if (method.isAnnotationPresent(Signature.class)) { + Class<?> rType = method.getReturnType(); + String rTypeName = rType.getName(); + if (!rType.isPrimitive() && acceptedSignatureTypes.contains(rTypeName)) { + throw new RuntimeException("unxepected type (" + rTypeName + ") used in signature"); + } sigMethods.add(method); } } + classLabel = o.getName(); } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/FileSinkDesc.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/FileSinkDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/FileSinkDesc.java index fcb6de7..e15a49f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/FileSinkDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/FileSinkDesc.java @@ -192,15 +192,11 @@ public class FileSinkDesc extends AbstractOperatorDesc implements IStatsGatherDe } @Explain(displayName = "directory", explainLevels = { Level.EXTENDED }) + @Signature public Path getDirName() { return dirName; } - @Signature - public String getDirNameString() { - return dirName.toString(); - } - public void setDirName(final Path dirName) { this.dirName = dirName; } @@ -220,6 +216,7 @@ public class FileSinkDesc extends AbstractOperatorDesc implements IStatsGatherDe } @Explain(displayName = "table", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED }) + @Signature public TableDesc getTableInfo() { return tableInfo; } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/HashTableSinkDesc.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/HashTableSinkDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/HashTableSinkDesc.java index d71ba5b..a61a47e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/HashTableSinkDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/HashTableSinkDesc.java @@ -308,10 +308,10 @@ public class HashTableSinkDesc extends JoinDesc implements Serializable { */ @Override @Explain(displayName = "keys") - public Map<String, String> getKeysString() { - Map<String, String> keyMap = new LinkedHashMap<>(); + public Map<Byte, String> getKeysString() { + Map<Byte, String> keyMap = new LinkedHashMap<Byte, String>(); for (Map.Entry<Byte, List<ExprNodeDesc>> k: getKeys().entrySet()) { - keyMap.put(String.valueOf(k.getKey()), PlanUtils.getExprListString(k.getValue())); + keyMap.put(k.getKey(), PlanUtils.getExprListString(k.getValue())); } return keyMap; } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/JoinDesc.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/JoinDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/JoinDesc.java index 95990b8..e7ca7f6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/JoinDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/JoinDesc.java @@ -231,14 +231,14 @@ public class JoinDesc extends AbstractOperatorDesc { */ @Explain(displayName = "keys") @Signature - public Map<String, String> getKeysString() { + public Map<Byte, String> getKeysString() { if (joinKeys == null) { return null; } - Map<String, String> keyMap = new LinkedHashMap<String, String>(); + Map<Byte, String> keyMap = new LinkedHashMap<Byte, String>(); for (byte i = 0; i < joinKeys.length; i++) { - keyMap.put(String.valueOf(i), PlanUtils.getExprListString(Arrays.asList(joinKeys[i]))); + keyMap.put(i, PlanUtils.getExprListString(Arrays.asList(joinKeys[i]))); } return keyMap; } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java index dc4f085..54b705d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/MapJoinDesc.java @@ -213,10 +213,10 @@ public class MapJoinDesc extends JoinDesc implements Serializable { */ @Override @Explain(displayName = "keys") - public Map<String, String> getKeysString() { - Map<String, String> keyMap = new LinkedHashMap<>(); + public Map<Byte, String> getKeysString() { + Map<Byte, String> keyMap = new LinkedHashMap<Byte, String>(); for (Map.Entry<Byte, List<ExprNodeDesc>> k: getKeys().entrySet()) { - keyMap.put(String.valueOf(k.getKey()), PlanUtils.getExprListString(k.getValue())); + keyMap.put(k.getKey(), PlanUtils.getExprListString(k.getValue())); } return keyMap; } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/CachingStatsSource.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/CachingStatsSource.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/CachingStatsSource.java index 2841638..c515276 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/CachingStatsSource.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/CachingStatsSource.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; +import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; import org.apache.hadoop.hive.ql.stats.OperatorStats; @@ -34,8 +36,9 @@ public class CachingStatsSource implements StatsSource { private final Cache<OpTreeSignature, OperatorStats> cache; - public CachingStatsSource(int cacheSize) { - cache = CacheBuilder.newBuilder().maximumSize(cacheSize).build(); + public CachingStatsSource(HiveConf conf) { + int size = conf.getIntVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_CACHE_SIZE); + cache = CacheBuilder.newBuilder().maximumSize(size).build(); } public void put(OpTreeSignature sig, OperatorStats opStat) { http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/EmptyStatsSource.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/EmptyStatsSource.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/EmptyStatsSource.java index 624f107..19df13a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/EmptyStatsSource.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/EmptyStatsSource.java @@ -24,7 +24,7 @@ import java.util.Optional; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; import org.apache.hadoop.hive.ql.stats.OperatorStats; -public final class EmptyStatsSource implements StatsSource { +public class EmptyStatsSource implements StatsSource { public static StatsSource INSTANCE = new EmptyStatsSource(); http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/MetastoreStatsConnector.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/MetastoreStatsConnector.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/MetastoreStatsConnector.java deleted file mode 100644 index 237c1cc..0000000 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/MetastoreStatsConnector.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hive.ql.plan.mapper; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import org.apache.hadoop.hive.metastore.api.RuntimeStat; -import org.apache.hadoop.hive.ql.metadata.Hive; -import org.apache.hadoop.hive.ql.metadata.HiveException; -import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; -import org.apache.hadoop.hive.ql.optimizer.signature.RuntimeStatsMap; -import org.apache.hadoop.hive.ql.optimizer.signature.RuntimeStatsPersister; -import org.apache.hadoop.hive.ql.stats.OperatorStats; -import org.apache.thrift.TException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Charsets; - -/** - * Decorates a StatSource to be loaded and persisted in the metastore as well. - */ -class MetastoreStatsConnector implements StatsSource { - - private static final Logger LOG = LoggerFactory.getLogger(MetastoreStatsConnector.class); - - private final StatsSource ss; - - private ExecutorService executor; - - MetastoreStatsConnector(StatsSource ss) { - this.ss = ss; - executor = Executors.newSingleThreadExecutor( - new BasicThreadFactory.Builder() - .namingPattern("Metastore-RuntimeStats-Loader-%d") - .daemon(true) - .build()); - - executor.submit(new RuntimeStatsLoader()); - } - - private class RuntimeStatsLoader implements Runnable { - - @Override - public void run() { - try { - List<RuntimeStat> rs = Hive.get().getMSC().getRuntimeStats(); - for (RuntimeStat thriftStat : rs) { - try { - ss.putAll(decode(thriftStat)); - } catch (IOException e) { - logException("Exception while loading runtime stats", e); - } - } - } catch (TException | HiveException e) { - logException("Exception while reading metastore runtime stats", e); - } - } - } - - @Override - public boolean canProvideStatsFor(Class<?> clazz) { - return ss.canProvideStatsFor(clazz); - } - - @Override - public Optional<OperatorStats> lookup(OpTreeSignature treeSig) { - return ss.lookup(treeSig); - } - - @Override - public void putAll(Map<OpTreeSignature, OperatorStats> map) { - ss.putAll(map); - executor.submit(new RuntimeStatsSubmitter(map)); - } - - class RuntimeStatsSubmitter implements Runnable { - - private Map<OpTreeSignature, OperatorStats> map; - - public RuntimeStatsSubmitter(Map<OpTreeSignature, OperatorStats> map) { - this.map = map; - } - - @Override - public void run() { - try { - RuntimeStat rec = encode(map); - Hive.get().getMSC().addRuntimeStat(rec); - } catch (TException | HiveException | IOException e) { - logException("Exception while persisting runtime stat", e); - } - } - } - - private RuntimeStat encode(Map<OpTreeSignature, OperatorStats> map) throws IOException { - String payload = RuntimeStatsPersister.INSTANCE.encode(new RuntimeStatsMap(map)); - RuntimeStat rs = new RuntimeStat(); - rs.setWeight(map.size()); - rs.setPayload(ByteBuffer.wrap(payload.getBytes(Charsets.UTF_8))); - return rs; - } - - private Map<OpTreeSignature, OperatorStats> decode(RuntimeStat rs) throws IOException { - RuntimeStatsMap rsm = RuntimeStatsPersister.INSTANCE.decode(rs.getPayload(), RuntimeStatsMap.class); - return rsm.toMap(); - } - - public void destroy() { - executor.shutdown(); - } - - static void logException(String msg, Exception e) { - if (LOG.isDebugEnabled()) { - LOG.debug(msg, e); - } else { - LOG.info(msg + ": " + e.getMessage()); - } - } - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/PlanMapper.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/PlanMapper.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/PlanMapper.java index e932304..a372804 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/PlanMapper.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/PlanMapper.java @@ -18,9 +18,7 @@ package org.apache.hadoop.hive.ql.plan.mapper; -import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -36,7 +34,6 @@ import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignatureFactory; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Sets; /** * Enables to connect related objects to eachother. @@ -46,106 +43,7 @@ import com.google.common.collect.Sets; public class PlanMapper { Set<EquivGroup> groups = new HashSet<>(); - private Map<Object, EquivGroup> objectMap = new CompositeMap<>(OpTreeSignature.class); - - /** - * Specialized class which can compare by identity or value; based on the key type. - */ - private static class CompositeMap<K, V> implements Map<K, V> { - - Map<K, V> comparedMap = new HashMap<>(); - Map<K, V> identityMap = new IdentityHashMap<>(); - final Set<Class<?>> typeCompared; - - CompositeMap(Class<?>... comparedTypes) { - for (Class<?> class1 : comparedTypes) { - if (!Modifier.isFinal(class1.getModifiers())) { - throw new RuntimeException(class1 + " is not final...for this to reliably work; it should be"); - } - } - typeCompared = Sets.newHashSet(comparedTypes); - } - - @Override - public int size() { - return comparedMap.size() + identityMap.size(); - } - - @Override - public boolean isEmpty() { - return comparedMap.isEmpty() && identityMap.isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return comparedMap.containsKey(key) || identityMap.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return comparedMap.containsValue(value) || identityMap.containsValue(value); - } - - @Override - public V get(Object key) { - V v0 = comparedMap.get(key); - if (v0 != null) { - return v0; - } - return identityMap.get(key); - } - - @Override - public V put(K key, V value) { - if (shouldCompare(key.getClass())) { - return comparedMap.put(key, value); - } else { - return identityMap.put(key, value); - } - } - - @Override - public V remove(Object key) { - if (shouldCompare(key.getClass())) { - return comparedMap.remove(key); - } else { - return identityMap.remove(key); - } - } - - private boolean shouldCompare(Class<?> key) { - return typeCompared.contains(key); - } - - @Override - public void putAll(Map<? extends K, ? extends V> m) { - for (Entry<? extends K, ? extends V> e : m.entrySet()) { - put(e.getKey(), e.getValue()); - } - } - - @Override - public void clear() { - comparedMap.clear(); - identityMap.clear(); - } - - @Override - public Set<K> keySet() { - return Sets.union(comparedMap.keySet(), identityMap.keySet()); - } - - @Override - public Collection<V> values() { - throw new UnsupportedOperationException("This method is not supported"); - } - - @Override - public Set<Entry<K, V>> entrySet() { - return Sets.union(comparedMap.entrySet(), identityMap.entrySet()); - } - - } + private Map<Object, EquivGroup> objectMap = new HashMap<>(); /** * A set of objects which are representing the same thing. @@ -157,7 +55,7 @@ public class PlanMapper { * there might be more than one, since an optimization may replace an operator with a new one * <li> Signature - to enable inter-plan look up of the same data * <li> OperatorStats - collected runtime information - * </ul> + * <ul> */ public class EquivGroup { Set<Object> members = new HashSet<>(); @@ -218,7 +116,7 @@ public class PlanMapper { private Object getKeyFor(Object o) { if (o instanceof Operator) { - Operator<?> operator = (Operator<?>) o; + Operator operator = (Operator) o; return signatureCache.getSignature(operator); } return o; http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/SimpleRuntimeStatsSource.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/SimpleRuntimeStatsSource.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/SimpleRuntimeStatsSource.java index fb2b5f8..3d6c257 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/SimpleRuntimeStatsSource.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/SimpleRuntimeStatsSource.java @@ -18,33 +18,48 @@ package org.apache.hadoop.hive.ql.plan.mapper; +import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; import org.apache.hadoop.hive.ql.stats.OperatorStats; -public class MapBackedStatsSource implements StatsSource { +public class SimpleRuntimeStatsSource implements StatsSource { - private Map<OpTreeSignature, OperatorStats> map = new ConcurrentHashMap<>(); + private final PlanMapper pm; + + + public SimpleRuntimeStatsSource(PlanMapper pm) { + this.pm = pm; + } @Override - public boolean canProvideStatsFor(Class<?> clazz) { - if (Operator.class.isAssignableFrom(clazz)) { - return true; + public Optional<OperatorStats> lookup(OpTreeSignature sig) { + try { + List<OperatorStats> v = pm.lookupAll(OperatorStats.class, sig); + if (v.size() > 0) { + return Optional.of(v.get(0)); + } + return Optional.empty(); + } catch (NoSuchElementException | IllegalArgumentException iae) { + return Optional.empty(); } - return false; } @Override - public Optional<OperatorStats> lookup(OpTreeSignature treeSig) { - return Optional.ofNullable(map.get(treeSig)); + public boolean canProvideStatsFor(Class<?> class1) { + if (Operator.class.isAssignableFrom(class1)) { + return true; + } + return false; } @Override public void putAll(Map<OpTreeSignature, OperatorStats> map) { - this.map.putAll(map); + throw new RuntimeException(); } -} \ No newline at end of file + +} http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/StatsSources.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/StatsSources.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/StatsSources.java index 30b6a30..a4e33c3 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/StatsSources.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/mapper/StatsSources.java @@ -18,12 +18,14 @@ package org.apache.hadoop.hive.ql.plan.mapper; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import org.apache.hadoop.hive.conf.HiveConf; -import org.apache.hadoop.hive.conf.HiveConf.ConfVars; +import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.optimizer.signature.OpTreeSignature; import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper.EquivGroup; import org.apache.hadoop.hive.ql.stats.OperatorStats; @@ -31,50 +33,53 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMap.Builder; public class StatsSources { - private static final Logger LOG = LoggerFactory.getLogger(StatsSources.class); + public static class MapBackedStatsSource implements StatsSource { - static enum StatsSourceMode { - query, hiveserver, metastore; - } + private Map<OpTreeSignature, OperatorStats> map = new HashMap<>(); - public static void initialize(HiveConf hiveConf) { - // requesting for the stats source will implicitly initialize it - getStatsSource(hiveConf); - } + @Override + public boolean canProvideStatsFor(Class<?> clazz) { + if (Operator.class.isAssignableFrom(clazz)) { + return true; + } + return false; + } - public static StatsSource getStatsSource(HiveConf conf) { - String mode = conf.getVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_PERSISTENCE); - int cacheSize = conf.getIntVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_CACHE_SIZE); - switch (mode) { - case "query": - return new MapBackedStatsSource(); - case "hiveserver": - return StatsSources.globalStatsSource(cacheSize); - case "metastore": - return StatsSources.metastoreBackedStatsSource(StatsSources.globalStatsSource(cacheSize)); - default: - throw new RuntimeException("Unknown StatsSource setting: " + mode); + @Override + public Optional<OperatorStats> lookup(OpTreeSignature treeSig) { + return Optional.ofNullable(map.get(treeSig)); } + + @Override + public void putAll(Map<OpTreeSignature, OperatorStats> map) { + map.putAll(map); + } + } + private static final Logger LOG = LoggerFactory.getLogger(StatsSources.class); + public static StatsSource getStatsSourceContaining(StatsSource currentStatsSource, PlanMapper pm) { - StatsSource statsSource = currentStatsSource; - if (currentStatsSource == EmptyStatsSource.INSTANCE) { - statsSource = new MapBackedStatsSource(); + if (currentStatsSource instanceof CachingStatsSource) { + CachingStatsSource sessionStatsSource = (CachingStatsSource) currentStatsSource; + loadFromPlanMapper(sessionStatsSource, pm); + return sessionStatsSource; + } else { + return new SimpleRuntimeStatsSource(pm); } + } - Map<OpTreeSignature, OperatorStats> statMap = extractStatMapFromPlanMapper(pm); - statsSource.putAll(statMap); - return statsSource; + public static void loadFromPlanMapper(CachingStatsSource sessionStatsSource, PlanMapper pm) { + Map<OpTreeSignature, OperatorStats> map = extractStatMapFromPlanMapper(pm); + sessionStatsSource.putAll(map); } + private static Map<OpTreeSignature, OperatorStats> extractStatMapFromPlanMapper(PlanMapper pm) { - Builder<OpTreeSignature, OperatorStats> map = ImmutableMap.builder(); + Map<OpTreeSignature, OperatorStats> map = new HashMap<OpTreeSignature, OperatorStats>(); Iterator<EquivGroup> it = pm.iterateGroups(); while (it.hasNext()) { EquivGroup e = it.next(); @@ -98,33 +103,20 @@ public class StatsSources { map.put(sig.get(0), stat.get(0)); } } - return map.build(); + return map; } private static StatsSource globalStatsSource; - private static MetastoreStatsConnector metastoreStatsConnector; - public static StatsSource globalStatsSource(int cacheSize) { + public static StatsSource globalStatsSource(HiveConf conf) { if (globalStatsSource == null) { - globalStatsSource = new CachingStatsSource(cacheSize); + globalStatsSource = new CachingStatsSource(conf); } return globalStatsSource; } - public static StatsSource metastoreBackedStatsSource(StatsSource parent) { - if (metastoreStatsConnector == null) { - metastoreStatsConnector = new MetastoreStatsConnector(parent); - } - return metastoreStatsConnector; - } - @VisibleForTesting - public static void clearGlobalStats() { - if (metastoreStatsConnector != null) { - metastoreStatsConnector.destroy(); - } + public static void clearAllStats() { globalStatsSource = null; - metastoreStatsConnector = null; } - } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/reexec/ReOptimizePlugin.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/reexec/ReOptimizePlugin.java b/ql/src/java/org/apache/hadoop/hive/ql/reexec/ReOptimizePlugin.java index 8dc7387..409cc73 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/reexec/ReOptimizePlugin.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/reexec/ReOptimizePlugin.java @@ -84,7 +84,22 @@ public class ReOptimizePlugin implements IReExecutionPlugin { alwaysCollectStats = driver.getConf().getBoolVar(ConfVars.HIVE_QUERY_REEXECUTION_ALWAYS_COLLECT_OPERATOR_STATS); statsReaderHook.setCollectOnSuccess(alwaysCollectStats); - coreDriver.setStatsSource(StatsSources.getStatsSource(driver.getConf())); + coreDriver.setStatsSource(getStatsSource(driver.getConf())); + } + + static enum StatsSourceMode { + query, hiveserver; + } + + private StatsSource getStatsSource(HiveConf conf) { + StatsSourceMode mode = StatsSourceMode.valueOf(conf.getVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_PERSISTENCE)); + switch (mode) { + case query: + return new StatsSources.MapBackedStatsSource(); + case hiveserver: + return StatsSources.globalStatsSource(conf); + } + throw new RuntimeException("Unknown StatsSource setting: " + mode); } @Override http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/java/org/apache/hadoop/hive/ql/stats/OperatorStats.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/stats/OperatorStats.java b/ql/src/java/org/apache/hadoop/hive/ql/stats/OperatorStats.java index d70bb82..52e18a8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/stats/OperatorStats.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/stats/OperatorStats.java @@ -6,9 +6,7 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,20 +15,10 @@ */ package org.apache.hadoop.hive.ql.stats; -import com.google.common.base.Objects; - -/** - * Holds information an operator's statistics. - */ -public final class OperatorStats { - private String operatorId; +public class OperatorStats { + private final String operatorId; private long outputRecords; - // for jackson - @SuppressWarnings("unused") - private OperatorStats() { - } - public OperatorStats(final String opId) { this.operatorId = opId; this.outputRecords = -1; @@ -52,19 +40,4 @@ public final class OperatorStats { public String toString() { return String.format("OperatorStats %s records: %d", operatorId, outputRecords); } - - @Override - public int hashCode() { - return Objects.hashCode(operatorId, outputRecords); - } - - @Override - public boolean equals(Object obj) { - if(obj==null || obj.getClass()!= OperatorStats.class){ - return false; - } - OperatorStats o = (OperatorStats) obj; - return Objects.equal(operatorId, o.operatorId) && - Objects.equal(outputRecords, o.outputRecords); - } } http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/test/org/apache/hadoop/hive/ql/optimizer/signature/TestRuntimeStatsPersistence.java ---------------------------------------------------------------------- diff --git a/ql/src/test/org/apache/hadoop/hive/ql/optimizer/signature/TestRuntimeStatsPersistence.java b/ql/src/test/org/apache/hadoop/hive/ql/optimizer/signature/TestRuntimeStatsPersistence.java deleted file mode 100644 index 627c2d8..0000000 --- a/ql/src/test/org/apache/hadoop/hive/ql/optimizer/signature/TestRuntimeStatsPersistence.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.hadoop.hive.ql.optimizer.signature; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.hadoop.hive.ql.CompilationOpContext; -import org.apache.hadoop.hive.ql.exec.Operator; -import org.apache.hadoop.hive.ql.exec.OperatorFactory; -import org.apache.hadoop.hive.ql.metadata.Table; -import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; -import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; -import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; -import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; -import org.apache.hadoop.hive.ql.plan.FilterDesc; -import org.apache.hadoop.hive.ql.plan.JoinCondDesc; -import org.apache.hadoop.hive.ql.plan.OperatorDesc; -import org.apache.hadoop.hive.ql.plan.TableScanDesc; -import org.apache.hadoop.hive.ql.stats.OperatorStats; -import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; -import org.apache.hadoop.hive.ql.udf.generic.GenericUDFConcat; -import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; -import org.junit.Test; - -import com.google.common.collect.Lists; - -public class TestRuntimeStatsPersistence { - - GenericUDF udf = new GenericUDFConcat(); - - CompilationOpContext cCtx = new CompilationOpContext(); - - private Operator<?> getFilTsOp(int i, int j) { - Operator<TableScanDesc> ts = getTsOp(i); - Operator<? extends OperatorDesc> fil = getFilterOp(j); - - connectOperators(ts, fil); - - return fil; - } - - private void connectOperators(Operator<?> parent, Operator<?> child) { - parent.getChildOperators().add(child); - child.getParentOperators().add(parent); - } - - @Test - public void checkPersistJoinCondDesc() throws Exception { - JoinCondDesc jcd = new JoinCondDesc(1, 2, 3); - JoinCondDesc jcd2 = persistenceLoop(jcd, JoinCondDesc.class); - assertEquals(jcd, jcd2); - } - - OpTreeSignatureFactory signatureFactory = OpTreeSignatureFactory.newCache(); - - @Test - public void checkPersistingSigWorks() throws Exception { - OpSignature sig = OpSignature.of(getTsOp(3)); - OpSignature sig2 = persistenceLoop(sig, OpSignature.class); - assertEquals(sig, sig2); - } - - @Test - public void checkPersistingTreeSigWorks() throws Exception { - OpTreeSignature sig = signatureFactory.getSignature(getFilTsOp(3, 4)); - OpTreeSignature sig2 = persistenceLoop(sig, OpTreeSignature.class); - assertEquals(sig, sig2); - } - - @Test - public void checkCanStoreAsGraph() throws Exception { - - Operator<?> ts = getTsOp(0); - Operator<?> fil1 = getFilterOp(1); - Operator<?> fil2 = getFilterOp(2); - Operator<?> fil3 = getFilterOp(3); - - connectOperators(ts, fil1); - connectOperators(ts, fil2); - connectOperators(fil1, fil3); - connectOperators(fil2, fil3); - - OpTreeSignature sig = signatureFactory.getSignature(fil3); - OpTreeSignature sig2 = persistenceLoop(sig, OpTreeSignature.class); - - assertEquals(sig, sig2); - - OpTreeSignature o0 = sig.getParentSig().get(0).getParentSig().get(0); - OpTreeSignature o1 = sig.getParentSig().get(1).getParentSig().get(0); - assertTrue("these have to be the same instance", o0 == o1); - - OpTreeSignature p0 = sig2.getParentSig().get(0).getParentSig().get(0); - OpTreeSignature p1 = sig2.getParentSig().get(1).getParentSig().get(0); - - assertTrue("these have to be the same instance", p0 == p1); - - assertEquals(p0, p1); - - } - - @Test - public void checkCanStoreMap() throws Exception { - - Map<OpTreeSignature, OperatorStats> map = new HashMap<>(); - map.put(signatureFactory.getSignature(getTsOp(0)), new OperatorStats("ts0")); - map.put(signatureFactory.getSignature(getTsOp(1)), new OperatorStats("ts1")); - - RuntimeStatsMap rsm = new RuntimeStatsMap(map); - - RuntimeStatsMap rsm2 = persistenceLoop(rsm, RuntimeStatsMap.class); - OpTreeSignature k1 = rsm.toMap().keySet().iterator().next(); - OpTreeSignature k2 = rsm2.toMap().keySet().iterator().next(); - assertEquals(k1, k2); - assertEquals(rsm, rsm2); - } - - private <T> T persistenceLoop(T sig, Class<T> clazz) throws IOException { - RuntimeStatsPersister sp = RuntimeStatsPersister.INSTANCE; - String stored = sp.encode(sig); - System.out.println(stored); - T sig2 = sp.decode(stored, clazz); - return sig2; - } - - private Operator<? extends OperatorDesc> getFilterOp(int constVal) { - ExprNodeDesc pred = new ExprNodeConstantDesc(constVal); - FilterDesc fd = new FilterDesc(pred, true); - Operator<? extends OperatorDesc> op = OperatorFactory.get(cCtx, fd); - return op; - } - - private Operator<TableScanDesc> getTsOp(int i) { - Table tblMetadata = new Table("db", "table"); - TableScanDesc desc = new TableScanDesc("alias"/*+ cCtx.nextOperatorId()*/, tblMetadata); - List<ExprNodeDesc> as = - Lists.newArrayList(new ExprNodeConstantDesc(TypeInfoFactory.intTypeInfo, Integer.valueOf(i)), - new ExprNodeColumnDesc(TypeInfoFactory.intTypeInfo, "c1", "aa", false)); - ExprNodeGenericFuncDesc f1 = new ExprNodeGenericFuncDesc(TypeInfoFactory.intTypeInfo, udf, as); - desc.setFilterExpr(f1); - Operator<TableScanDesc> ts = OperatorFactory.get(cCtx, desc); - return ts; - } - -} http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestCounterMapping.java ---------------------------------------------------------------------- diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestCounterMapping.java b/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestCounterMapping.java index e8a7a1b..8126970 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestCounterMapping.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestCounterMapping.java @@ -33,11 +33,10 @@ import org.apache.hadoop.hive.ql.exec.FilterOperator; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveFilter; import org.apache.hadoop.hive.ql.parse.ParseException; -import org.apache.hadoop.hive.ql.plan.mapper.EmptyStatsSource; import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper; -import org.apache.hadoop.hive.ql.plan.mapper.StatsSources; -import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper.EquivGroup; +import org.apache.hadoop.hive.ql.plan.mapper.SimpleRuntimeStatsSource; import org.apache.hadoop.hive.ql.reexec.ReExecDriver; +import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper.EquivGroup; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.stats.OperatorStats; import org.apache.hadoop.hive.ql.stats.OperatorStatsReaderHook; @@ -130,7 +129,7 @@ public class TestCounterMapping { FilterOperator filter1 = filters1.get(0); driver = createDriver(); - ((ReExecDriver) driver).setStatsSource(StatsSources.getStatsSourceContaining(EmptyStatsSource.INSTANCE, pm1)); + ((ReExecDriver) driver).setStatsSource(new SimpleRuntimeStatsSource(pm1)); PlanMapper pm2 = getMapperForQuery(driver, query); http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestReOptimization.java ---------------------------------------------------------------------- diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestReOptimization.java b/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestReOptimization.java index 8bec56f..b726300 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestReOptimization.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/plan/mapping/TestReOptimization.java @@ -27,18 +27,15 @@ import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.ql.DriverFactory; import org.apache.hadoop.hive.ql.IDriver; -import org.apache.hadoop.hive.ql.exec.CommonJoinOperator; import org.apache.hadoop.hive.ql.exec.FilterOperator; import org.apache.hadoop.hive.ql.plan.Statistics; import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper; -import org.apache.hadoop.hive.ql.plan.mapper.StatsSources; import org.apache.hadoop.hive.ql.plan.mapper.PlanMapper.EquivGroup; import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.stats.OperatorStats; import org.apache.hadoop.hive.ql.stats.OperatorStatsReaderHook; import org.apache.hive.testutils.HiveTestEnvSetup; -import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -58,7 +55,7 @@ public class TestReOptimization { public static void beforeClass() throws Exception { IDriver driver = createDriver(""); dropTables(driver); - String[] cmds = { + String cmds[] = { // @formatter:off "create table tu(id_uv int,id_uw int,u int)", "create table tv(id_uv int,v int)", @@ -81,13 +78,8 @@ public class TestReOptimization { dropTables(driver); } - @After - public void after() { - StatsSources.clearGlobalStats(); - } - public static void dropTables(IDriver driver) throws Exception { - String[] tables = new String[] {"tu", "tv", "tw" }; + String tables[] = { "tu", "tv", "tw" }; for (String t : tables) { int ret = driver.run("drop table if exists " + t).getResponseCode(); assertEquals("Checking command success", 0, ret); @@ -106,9 +98,7 @@ public class TestReOptimization { @Test public void testStatsAreSetInReopt() throws Exception { IDriver driver = createDriver("overlay,reoptimize"); - String query = "select assert_true_oom(${hiveconf:zzz} > sum(u*v))" - + " from tu join tv on (tu.id_uv=tv.id_uv)" - + " where u<10 and v>1"; + String query = "select assert_true_oom(${hiveconf:zzz} > sum(u*v)) from tu join tv on (tu.id_uv=tv.id_uv) where u<10 and v>1"; PlanMapper pm = getMapperForQuery(driver, query); Iterator<EquivGroup> itG = pm.iterateGroups(); @@ -143,7 +133,7 @@ public class TestReOptimization { IDriver driver = createDriver("overlay,reoptimize"); String query = "select assert_true_oom(${hiveconf:zzz}>sum(1)) from tu join tv on (tu.id_uv=tv.id_uv) where u<10 and v>1"; - getMapperForQuery(driver, query); + PlanMapper pm = getMapperForQuery(driver, query); } @@ -153,72 +143,8 @@ public class TestReOptimization { String query = "select assert_true(${hiveconf:zzz}>sum(1)) from tu join tv on (tu.id_uv=tv.id_uv) where u<10 and v>1"; - getMapperForQuery(driver, query); - assertEquals(1, driver.getContext().getExecutionIndex()); - } - - @Test - public void testStatCachingQuery() throws Exception { - HiveConf conf = env_setup.getTestCtx().hiveConf; - conf.setVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_PERSISTENCE, "query"); - conf.setBoolVar(ConfVars.HIVE_QUERY_REEXECUTION_ALWAYS_COLLECT_OPERATOR_STATS, true); - - checkRuntimeStatsReuse(false, false, false); - } - - @Test - public void testStatCachingHS2() throws Exception { - HiveConf conf = env_setup.getTestCtx().hiveConf; - conf.setVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_PERSISTENCE, "hiveserver"); - conf.setBoolVar(ConfVars.HIVE_QUERY_REEXECUTION_ALWAYS_COLLECT_OPERATOR_STATS, true); - - checkRuntimeStatsReuse(true, true, false); - } - - @Test - public void testStatCachingMetaStore() throws Exception { - HiveConf conf = env_setup.getTestCtx().hiveConf; - conf.setVar(ConfVars.HIVE_QUERY_REEXECUTION_STATS_PERSISTENCE, "metastore"); - conf.setBoolVar(ConfVars.HIVE_QUERY_REEXECUTION_ALWAYS_COLLECT_OPERATOR_STATS, true); - - checkRuntimeStatsReuse(true, true, true); - } - - private void checkRuntimeStatsReuse( - boolean expectInSameSession, - boolean expectNewHs2Session, - boolean expectHs2Instance) throws CommandProcessorResponse { - { - // same session - IDriver driver = createDriver("reoptimize"); - checkUsageOfRuntimeStats(driver, false); - driver = DriverFactory.newDriver(env_setup.getTestCtx().hiveConf); - checkUsageOfRuntimeStats(driver, expectInSameSession); - } - { - // new session - IDriver driver = createDriver("reoptimize"); - checkUsageOfRuntimeStats(driver, expectNewHs2Session); - } - StatsSources.clearGlobalStats(); - { - // new hs2 instance session - IDriver driver = createDriver("reoptimize"); - checkUsageOfRuntimeStats(driver, expectHs2Instance); - } - } - - @SuppressWarnings("rawtypes") - private void checkUsageOfRuntimeStats(IDriver driver, boolean expected) throws CommandProcessorResponse { - String query = "select sum(u) from tu join tv on (tu.id_uv=tv.id_uv) where u<10 and v>1"; PlanMapper pm = getMapperForQuery(driver, query); assertEquals(1, driver.getContext().getExecutionIndex()); - List<CommonJoinOperator> allJoin = pm.getAll(CommonJoinOperator.class); - CommonJoinOperator join = allJoin.iterator().next(); - Statistics joinStat = join.getStatistics(); - - assertEquals("expectation of the usage of runtime stats doesn't match", expected, - joinStat.isRuntimeStats()); } @Test @@ -226,7 +152,7 @@ public class TestReOptimization { IDriver driver = createDriver("overlay,reoptimize"); String query = "explain reoptimization select 1 from tu join tv on (tu.id_uv=tv.id_uv) where u<10 and v>1"; - getMapperForQuery(driver, query); + PlanMapper pm = getMapperForQuery(driver, query); List<String> res = new ArrayList<>(); List<String> res1 = new ArrayList<>(); while (driver.getResults(res1)) { @@ -239,7 +165,6 @@ public class TestReOptimization { } - private static IDriver createDriver(String strategies) { HiveConf conf = env_setup.getTestCtx().hiveConf; http://git-wip-us.apache.org/repos/asf/hive/blob/f0199500/service/src/java/org/apache/hive/service/server/HiveServer2.java ---------------------------------------------------------------------- diff --git a/service/src/java/org/apache/hive/service/server/HiveServer2.java b/service/src/java/org/apache/hive/service/server/HiveServer2.java index e373628..1642357 100644 --- a/service/src/java/org/apache/hive/service/server/HiveServer2.java +++ b/service/src/java/org/apache/hive/service/server/HiveServer2.java @@ -81,7 +81,6 @@ import org.apache.hadoop.hive.ql.metadata.Hive; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.HiveMaterializedViewsRegistry; import org.apache.hadoop.hive.ql.metadata.events.NotificationEventPoll; -import org.apache.hadoop.hive.ql.plan.mapper.StatsSources; import org.apache.hadoop.hive.ql.session.ClearDanglingScratchDir; import org.apache.hadoop.hive.ql.session.SessionState; import org.apache.hadoop.hive.ql.util.ZooKeeperHiveHelper; @@ -248,8 +247,6 @@ public class HiveServer2 extends CompositeService { // Create views registry HiveMaterializedViewsRegistry.get().init(); - StatsSources.initialize(hiveConf); - // Setup cache if enabled. if (hiveConf.getBoolVar(HiveConf.ConfVars.HIVE_QUERY_RESULTS_CACHE_ENABLED)) { try {