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