You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pr...@apache.org on 2018/06/13 22:14:30 UTC

hive git commit: HIVE-19873: Cleanup operation log on query cancellation after some delay (Prasanth Jayachandran reviewed by Sergey Shelukhin)

Repository: hive
Updated Branches:
  refs/heads/master 33e208c07 -> 14e3f19d0


HIVE-19873: Cleanup operation log on query cancellation after some delay (Prasanth Jayachandran reviewed by Sergey Shelukhin)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/14e3f19d
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/14e3f19d
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/14e3f19d

Branch: refs/heads/master
Commit: 14e3f19d027858a6f36ea6d41a3e8e45625f91bf
Parents: 33e208c
Author: Prasanth Jayachandran <pr...@apache.org>
Authored: Wed Jun 13 15:13:36 2018 -0700
Committer: Prasanth Jayachandran <pr...@apache.org>
Committed: Wed Jun 13 15:13:36 2018 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/hive/conf/HiveConf.java   |  3 ++
 .../hadoop/hive/ql/session/OperationLog.java    |  5 ++++
 .../cli/operation/HiveCommandOperation.java     |  4 +--
 .../cli/operation/MetadataOperation.java        |  2 +-
 .../hive/service/cli/operation/Operation.java   | 31 ++++++++++++++++++--
 .../service/cli/operation/SQLOperation.java     |  8 +++--
 6 files changed, 44 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/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 8a45b9c..99bb400 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -3146,6 +3146,9 @@ public class HiveConf extends Configuration {
         "  EXECUTION: Log completion of tasks\n" +
         "  PERFORMANCE: Execution + Performance logs \n" +
         "  VERBOSE: All logs" ),
+    HIVE_SERVER2_OPERATION_LOG_CLEANUP_DELAY("hive.server2.operation.log.cleanup.delay", "300s",
+      new TimeValidator(TimeUnit.SECONDS), "When a query is cancelled (via kill query, query timeout or triggers),\n" +
+      " operation logs gets cleaned up after this delay"),
 
     // HS2 connections guard rails
     HIVE_SERVER2_LIMIT_CONNECTIONS_PER_USER("hive.server2.limit.connections.per.user", 0,

http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/ql/src/java/org/apache/hadoop/hive/ql/session/OperationLog.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/session/OperationLog.java b/ql/src/java/org/apache/hadoop/hive/ql/session/OperationLog.java
index 7213dbf..6d75c29 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/session/OperationLog.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/session/OperationLog.java
@@ -211,4 +211,9 @@ public class OperationLog {
       return logs;
     }
   }
+
+  @Override
+  public String toString() {
+    return logFile.file.toString();
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java
index 4745688..99eaf02 100644
--- a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java
+++ b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java
@@ -34,8 +34,6 @@ import org.apache.commons.lang3.CharEncoding;
 import org.apache.hadoop.hive.metastore.api.Schema;
 import org.apache.hadoop.hive.ql.processors.CommandProcessor;
 import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse;
-import org.apache.hadoop.hive.ql.session.OperationLog;
-import org.apache.hadoop.hive.ql.session.OperationLog.LoggingLevel;
 import org.apache.hadoop.hive.ql.session.SessionState;
 import org.apache.hive.service.ServiceUtils;
 import org.apache.hive.service.cli.FetchOrientation;
@@ -148,7 +146,7 @@ public class HiveCommandOperation extends ExecuteStatementOperation {
     setState(OperationState.CLOSED);
     tearDownSessionIO();
     cleanTmpFile();
-    cleanupOperationLog();
+    cleanupOperationLog(0);
   }
 
   /* (non-Javadoc)

http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/service/src/java/org/apache/hive/service/cli/operation/MetadataOperation.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/operation/MetadataOperation.java b/service/src/java/org/apache/hive/service/cli/operation/MetadataOperation.java
index 3be21b5..00a308a 100644
--- a/service/src/java/org/apache/hive/service/cli/operation/MetadataOperation.java
+++ b/service/src/java/org/apache/hive/service/cli/operation/MetadataOperation.java
@@ -56,7 +56,7 @@ public abstract class MetadataOperation extends Operation {
   @Override
   public void close() throws HiveSQLException {
     setState(OperationState.CLOSED);
-    cleanupOperationLog();
+    cleanupOperationLog(0);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/service/src/java/org/apache/hive/service/cli/operation/Operation.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/operation/Operation.java b/service/src/java/org/apache/hive/service/cli/operation/Operation.java
index 07ab487..1ee0756 100644
--- a/service/src/java/org/apache/hive/service/cli/operation/Operation.java
+++ b/service/src/java/org/apache/hive/service/cli/operation/Operation.java
@@ -22,7 +22,9 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.hadoop.hive.common.LogUtils;
@@ -63,6 +65,7 @@ public abstract class Operation {
   protected volatile Future<?> backgroundHandle;
   protected OperationLog operationLog;
   protected boolean isOperationLogEnabled;
+  private ScheduledExecutorService scheduledExecutorService;
 
   private long operationTimeout;
   private volatile long lastAccessTime;
@@ -89,6 +92,7 @@ public abstract class Operation {
     lastAccessTime = beginTime;
     operationTimeout = HiveConf.getTimeVar(parentSession.getHiveConf(),
         HiveConf.ConfVars.HIVE_SERVER2_IDLE_OPERATION_TIMEOUT, TimeUnit.MILLISECONDS);
+    scheduledExecutorService = Executors.newScheduledThreadPool(1);
 
     currentStateScope = updateOperationStateMetrics(null, MetricsConstant.OPERATION_PREFIX,
         MetricsConstant.COMPLETED_OPERATION_PREFIX, state);
@@ -250,7 +254,24 @@ public abstract class Operation {
     }
   }
 
-  protected synchronized void cleanupOperationLog() {
+  private static class OperationLogCleaner implements Runnable {
+    public static final Logger LOG = LoggerFactory.getLogger(OperationLogCleaner.class.getName());
+    private OperationLog operationLog;
+
+    public OperationLogCleaner(OperationLog operationLog) {
+      this.operationLog = operationLog;
+    }
+
+    @Override
+    public void run() {
+      if (operationLog != null) {
+        LOG.info("Closing operation log {}", operationLog);
+        operationLog.close();
+      }
+    }
+  }
+
+  protected synchronized void cleanupOperationLog(final long operationLogCleanupDelayMs) {
     // stop the appenders for the operation log
     String queryId = queryState.getQueryId();
     LogUtils.stopQueryAppender(LogDivertAppender.QUERY_ROUTING_APPENDER, queryId);
@@ -265,7 +286,13 @@ public abstract class Operation {
             + "but its OperationLog object cannot be found. "
             + "Perhaps the operation has already terminated.");
       } else {
-        operationLog.close();
+        if (operationLogCleanupDelayMs > 0) {
+          scheduledExecutorService.schedule(new OperationLogCleaner(operationLog), operationLogCleanupDelayMs,
+            TimeUnit.MILLISECONDS);
+        } else {
+          LOG.info("Closing operation log {} without delay", operationLog);
+          operationLog.close();
+        }
       }
     }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/14e3f19d/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java
index 85f92d2..9a07fa1 100644
--- a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java
+++ b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java
@@ -95,6 +95,7 @@ public class SQLOperation extends ExecuteStatementOperation {
   private long queryTimeout;
   private ScheduledExecutorService timeoutExecutor;
   private final boolean runAsync;
+  private final long operationLogCleanupDelayMs;
 
   /**
    * A map to track query count running by each user
@@ -114,6 +115,8 @@ public class SQLOperation extends ExecuteStatementOperation {
     if (timeout > 0 && (queryTimeout <= 0 || timeout < queryTimeout)) {
       this.queryTimeout = timeout;
     }
+    this.operationLogCleanupDelayMs = HiveConf.getTimeVar(queryState.getConf(),
+      HiveConf.ConfVars.HIVE_SERVER2_OPERATION_LOG_CLEANUP_DELAY, TimeUnit.MILLISECONDS);
 
     setupSessionIO(parentSession.getSessionState());
 
@@ -341,7 +344,6 @@ public class SQLOperation extends ExecuteStatementOperation {
     }
   }
 
-
   /**
    * Returns the current UGI on the stack
    *
@@ -403,7 +405,7 @@ public class SQLOperation extends ExecuteStatementOperation {
       LOG.info("Cancelling the query execution: " + queryId);
     }
     cleanup(stateAfterCancel);
-    cleanupOperationLog();
+    cleanupOperationLog(operationLogCleanupDelayMs);
     if (stateAfterCancel == OperationState.CANCELED) {
       LOG.info("Successfully cancelled the query: " + queryId);
     }
@@ -412,7 +414,7 @@ public class SQLOperation extends ExecuteStatementOperation {
   @Override
   public void close() throws HiveSQLException {
     cleanup(OperationState.CLOSED);
-    cleanupOperationLog();
+    cleanupOperationLog(0);
   }
 
   @Override