diff --git ql/src/java/org/apache/hadoop/hive/ql/log/PerfLogger.java ql/src/java/org/apache/hadoop/hive/ql/log/PerfLogger.java index c77eb88..340fbf4 100644 --- ql/src/java/org/apache/hadoop/hive/ql/log/PerfLogger.java +++ ql/src/java/org/apache/hadoop/hive/ql/log/PerfLogger.java @@ -23,11 +23,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hive.conf.HiveConf; -import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.ql.QueryPlan; import org.apache.hadoop.hive.ql.session.SessionState; -import org.apache.hadoop.util.ReflectionUtils; /** * PerfLogger. @@ -55,7 +52,7 @@ static final private Log LOG = LogFactory.getLog(PerfLogger.class.getName()); - protected PerfLogger() { + public PerfLogger() { // Use getPerfLogger to get an instance of PerfLogger } @@ -68,26 +65,17 @@ public static PerfLogger getPerfLogger() { * * Use resetPerfLogger to require a new instance. Useful at the beginning of execution. * - * @return Tries to return an instance of the class whose name is configured in - * hive.exec.perf.logger, but if it can't it just returns an instance of - * the base PerfLogger class + * @return Session perflogger if there's a sessionstate, otherwise return the thread local instance */ public static PerfLogger getPerfLogger(boolean resetPerfLogger) { - if (perfLogger.get() == null || resetPerfLogger) { - if (SessionState.get() == null) { + if (SessionState.get() == null) { + if (perfLogger.get() == null || resetPerfLogger) { perfLogger.set(new PerfLogger()); - } else { - HiveConf conf = SessionState.get().getConf(); - try { - perfLogger.set((PerfLogger) ReflectionUtils.newInstance(conf.getClassByName( - conf.getVar(ConfVars.HIVE_PERF_LOGGER)), conf)); - } catch (ClassNotFoundException e) { - LOG.error("Performance Logger Class not found:" + e.getMessage()); - perfLogger.set(new PerfLogger()); - } } + return perfLogger.get(); + } else { + return SessionState.get().getPerfLogger(resetPerfLogger); } - return perfLogger.get(); } /** diff --git ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index a6e87c4..ab369f0 100644 --- ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -40,15 +40,18 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.ql.MapRedStats; import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.history.HiveHistory; +import org.apache.hadoop.hive.ql.log.PerfLogger; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.HiveUtils; import org.apache.hadoop.hive.ql.plan.HiveOperation; import org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider; import org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider; import org.apache.hadoop.hive.ql.util.DosToUnix; +import org.apache.hadoop.util.ReflectionUtils; /** * SessionState encapsulates common data associated with a session. @@ -133,6 +136,7 @@ */ LineageState ls; + private PerfLogger perfLogger; /** * Get the lineage state stored in this session. * @@ -746,4 +750,25 @@ public void close() throws IOException { LOG.info("Error removing session resource dir " + resourceDir, e); } } + + /** + * @param resetPerfLogger + * @return Tries to return an instance of the class whose name is configured in + * hive.exec.perf.logger, but if it can't it just returns an instance of + * the base PerfLogger class + + */ + public PerfLogger getPerfLogger(boolean resetPerfLogger) { + if ((perfLogger == null) || resetPerfLogger) { + try { + perfLogger = (PerfLogger) ReflectionUtils.newInstance(conf.getClassByName( + conf.getVar(ConfVars.HIVE_PERF_LOGGER)), conf); + } catch (ClassNotFoundException e) { + LOG.error("Performance Logger Class not found:" + e.getMessage()); + perfLogger = new PerfLogger(); + } + } + return perfLogger; + } + }