You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ng...@apache.org on 2022/07/13 17:05:50 UTC

[hive] branch master updated: [WIP] HIVE-21456: addendum: Improvements in Thrift over HTTP for Hive MetaStore (#3381)

This is an automated email from the ASF dual-hosted git repository.

ngangam pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 472bd526796 [WIP] HIVE-21456: addendum: Improvements in Thrift over HTTP for Hive MetaStore (#3381)
472bd526796 is described below

commit 472bd526796691e046ed5201276e60330a5ffe1a
Author: Sourabh Goyal <so...@cloudera.com>
AuthorDate: Wed Jul 13 10:05:37 2022 -0700

    [WIP] HIVE-21456: addendum: Improvements in Thrift over HTTP for Hive MetaStore (#3381)
    
    * [WIP]HIVE-21456: addendum: Improvements in Thrift over HTTP for Hive MetaStore
    
    Change-Id: Ide139bff133667eae9ac5cbf5699e20f0ab059df
    
    * Switches back to using jetty version 9.3.27.v20190418 in HiveMetaStore. Added a request listener in ServletContext
    
    Change-Id: Ic2380b6586ea1f56662f7599242cb0d77a2a3760
    
    * Removed unnecessary jetty dependencies
    
    Change-Id: I5ec5ce2434b58f3f48578e014225e0e114d00cb6
    
    * Addded comments and removed unnecessary code
    
    Change-Id: I0ce76b1c59a0e7262c64a74fdea85674475426ed
    
    * Removes unnecessary code
    
    Change-Id: I64b5f01926e2eb65cbb4c4069d2c6db17849b2e5
---
 standalone-metastore/metastore-server/pom.xml      | 15 +++++++
 .../hadoop/hive/metastore/HiveMetaStore.java       | 50 +++++++++++++++-------
 .../hadoop/hive/metastore/TestHiveMetaStore.java   |  2 +-
 standalone-metastore/pom.xml                       | 26 +++++++++++
 4 files changed, 76 insertions(+), 17 deletions(-)

diff --git a/standalone-metastore/metastore-server/pom.xml b/standalone-metastore/metastore-server/pom.xml
index d8a454e9545..8bafeb132ee 100644
--- a/standalone-metastore/metastore-server/pom.xml
+++ b/standalone-metastore/metastore-server/pom.xml
@@ -277,6 +277,21 @@
       <groupId>org.postgresql</groupId>
       <artifactId>postgresql</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
     <!-- test scope dependencies -->
     <dependency>
       <groupId>junit</groupId>
diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
index 445ea044401..083d1e39c4d 100644
--- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
+++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java
@@ -20,7 +20,6 @@ package org.apache.hadoop.hive.metastore;
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadFactory;
 import org.apache.commons.cli.OptionBuilder;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.ZKDeRegisterWatcher;
@@ -63,8 +62,10 @@ import org.apache.thrift.transport.TTransportFactory;
 
 import org.eclipse.jetty.security.ConstraintMapping;
 import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.server.HttpChannel;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.servlet.ServletContextHandler;
@@ -91,7 +92,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
-
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
 /**
  * TODO:pc remove application logic to a separate interface.
  */
@@ -398,18 +400,15 @@ public class HiveMetaStore extends ThriftHiveMetastore {
     // Server thread pool
     // Start with minWorkerThreads, expand till maxWorkerThreads and reject
     // subsequent requests
-    final String threadPoolNamePrefix = "HiveMetastore-HttpHandler-Pool";
-    ExecutorService executorService = new ThreadPoolExecutor(
-        minWorkerThreads, maxWorkerThreads, 60, TimeUnit.SECONDS,
-        new SynchronousQueue<>(), new ThreadFactory() {
-      @Override
-      public Thread newThread(@NotNull Runnable r) {
-        Thread newThread = new Thread(r);
-        newThread.setName(threadPoolNamePrefix + ": Thread-" + newThread.getId());
-        return newThread;
-      }
+    // TODO: Add a config for keepAlive time of threads ?
+    ExecutorService executorService = new ThreadPoolExecutor(minWorkerThreads, maxWorkerThreads, 60L,
+        TimeUnit.SECONDS, new SynchronousQueue<>(), r -> {
+      Thread thread = new Thread(r);
+      thread.setDaemon(true);
+      thread.setName("Metastore-HttpHandler-Pool: Thread-" + thread.getId());
+      return thread;
     });
-    ExecutorThreadPool threadPool = new ExecutorThreadPool((ThreadPoolExecutor) executorService);
+    ExecutorThreadPool threadPool = new ExecutorThreadPool(executorService);
     // HTTP Server
     org.eclipse.jetty.server.Server server = new Server(threadPool);
     server.setStopAtShutdown(true);
@@ -492,11 +491,30 @@ public class HiveMetaStore extends ThriftHiveMetastore {
     // Tons of stuff skipped as compared the HS2.
     // Sesions, XSRF, Compression, path configuration, etc.
     constraintHttpMethods(context, false);
-    server.setHandler(context);
 
     context.addServlet(new ServletHolder(thriftHttpServlet), httpPath);
-
-
+    // adding a listener on servlet request so as to clean up
+    // rawStore when http request is completed
+    context.addEventListener(new ServletRequestListener() {
+      @Override
+      public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
+        Request baseRequest = Request.getBaseRequest(servletRequestEvent.getServletRequest());
+        HttpChannel channel = baseRequest.getHttpChannel();
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("request: " + baseRequest + " destroyed " + ", http channel: " + channel);
+        }
+        HMSHandler.cleanupHandlerContext();
+      }
+      @Override
+      public void requestInitialized(ServletRequestEvent servletRequestEvent) {
+        Request baseRequest = Request.getBaseRequest(servletRequestEvent.getServletRequest());
+        HttpChannel channel = baseRequest.getHttpChannel();
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("request: " + baseRequest + " initialized " + ", http channel: " + channel);
+        }
+      }
+    });
+    server.setHandler(context);
     return new ThriftServer() {
       @Override
       public void start() throws Throwable {
diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java
index 786f963224e..fd54c8b06e2 100644
--- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java
+++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java
@@ -3330,7 +3330,7 @@ public abstract class TestHiveMetaStore {
     Field pmCache;
     Field pmf;
     try {
-      pmf = ObjectStore.class.getDeclaredField("pmf");
+      pmf = PersistenceManagerProvider.class.getDeclaredField("pmf");
       if (pmf != null) {
         pmf.setAccessible(true);
         jdoPmf = (JDOPersistenceManagerFactory) pmf.get(null);
diff --git a/standalone-metastore/pom.xml b/standalone-metastore/pom.xml
index b00282a0a94..42f5e963190 100644
--- a/standalone-metastore/pom.xml
+++ b/standalone-metastore/pom.xml
@@ -106,6 +106,7 @@
     <httpcomponents.core.version>4.4.13</httpcomponents.core.version>
     <pac4j-core.version>4.5.5</pac4j-core.version>
     <nimbus-jose-jwt.version>9.20</nimbus-jose-jwt.version>
+    <jetty.version>9.3.27.v20190418</jetty.version>
     <!-- Thrift properties -->
     <thrift.home>you-must-set-this-to-run-thrift</thrift.home>
     <thrift.gen.dir>${basedir}/src/gen/thrift</thrift.gen.dir>
@@ -206,6 +207,10 @@
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
           </exclusion>
+          <exclusion>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
       <dependency>
@@ -218,6 +223,12 @@
         <groupId>org.apache.hadoop</groupId>
         <artifactId>hadoop-hdfs</artifactId>
         <version>${hadoop.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
+        </exclusions>
       </dependency>
       <dependency>
         <groupId>org.apache.hadoop</groupId>
@@ -369,6 +380,21 @@
         <artifactId>httpcore</artifactId>
         <version>${httpcomponents.core.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.eclipse.jetty</groupId>
+        <artifactId>jetty-util</artifactId>
+        <version>${jetty.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.eclipse.jetty</groupId>
+        <artifactId>jetty-server</artifactId>
+        <version>${jetty.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.eclipse.jetty</groupId>
+        <artifactId>jetty-servlet</artifactId>
+        <version>${jetty.version}</version>
+      </dependency>
       <!-- test scope dependencies -->
       <dependency>
         <groupId>junit</groupId>