You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ss...@apache.org on 2016/04/08 23:39:25 UTC

[1/3] hive git commit: HIVE-13398. LLAP: Simple /status and /peers web services. (Gopal V, reviewed by Siddharth Seth, Sergey Shelukhin)

Repository: hive
Updated Branches:
  refs/heads/master b543e1e88 -> 9a00b2f4c


HIVE-13398. LLAP: Simple /status and /peers web services. (Gopal V, reviewed by Siddharth Seth, Sergey Shelukhin)


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

Branch: refs/heads/master
Commit: be20e60262348155d7b81c4a0ec0a727136652a8
Parents: b543e1e
Author: Siddharth Seth <ss...@apache.org>
Authored: Fri Apr 8 14:33:34 2016 -0700
Committer: Siddharth Seth <ss...@apache.org>
Committed: Fri Apr 8 14:33:34 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/hive/http/HttpServer.java   |   4 +-
 .../hive/llap/registry/ServiceRegistry.java     |   4 +-
 .../registry/impl/LlapFixedRegistryImpl.java    |   5 +-
 .../llap/registry/impl/LlapRegistryService.java |  17 +-
 .../impl/LlapZookeeperRegistryImpl.java         |   3 +-
 .../hive/llap/daemon/impl/LlapDaemon.java       |   7 +-
 .../daemon/services/impl/LlapWebServices.java   | 174 ++++++++++++++++++-
 7 files changed, 203 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/common/src/java/org/apache/hive/http/HttpServer.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hive/http/HttpServer.java b/common/src/java/org/apache/hive/http/HttpServer.java
index b8836de..0aa9c89 100644
--- a/common/src/java/org/apache/hive/http/HttpServer.java
+++ b/common/src/java/org/apache/hive/http/HttpServer.java
@@ -39,6 +39,7 @@ import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.authentication.server.AuthenticationFilter;
 import org.apache.hadoop.security.authorize.AccessControlList;
 import org.apache.hadoop.util.Shell;
+import org.apache.hadoop.hive.common.classification.InterfaceAudience;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Logger;
@@ -210,7 +211,8 @@ public class HttpServer {
    * @param response the servlet response.
    * @return TRUE/FALSE based on the logic described above.
    */
-  static boolean isInstrumentationAccessAllowed(
+  @InterfaceAudience.LimitedPrivate("hive")
+  public static boolean isInstrumentationAccessAllowed(
     ServletContext servletContext, HttpServletRequest request,
     HttpServletResponse response) throws IOException {
     Configuration conf =

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-client/src/java/org/apache/hadoop/hive/llap/registry/ServiceRegistry.java
----------------------------------------------------------------------
diff --git a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/ServiceRegistry.java b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/ServiceRegistry.java
index f94a837..4938c07 100644
--- a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/ServiceRegistry.java
+++ b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/ServiceRegistry.java
@@ -37,9 +37,11 @@ public interface ServiceRegistry {
   /**
    * Register the current instance - the implementation takes care of the endpoints to register.
    *
+   * @return self identifying name
+   * 
    * @throws IOException
    */
-  public void register() throws IOException;
+  public String register() throws IOException;
 
   /**
    * Remove the current registration cleanly (implementation defined cleanup)

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapFixedRegistryImpl.java
----------------------------------------------------------------------
diff --git a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapFixedRegistryImpl.java b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapFixedRegistryImpl.java
index 8cace8f..3f667d0 100644
--- a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapFixedRegistryImpl.java
+++ b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapFixedRegistryImpl.java
@@ -89,8 +89,9 @@ public class LlapFixedRegistryImpl implements ServiceRegistry {
   }
 
   @Override
-  public void register() throws IOException {
-    // nothing to register
+  public String register() throws IOException {
+    // nothing to register (return host-<hostname>)
+    return getWorkerIdentity(InetAddress.getLocalHost().getCanonicalHostName());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapRegistryService.java
----------------------------------------------------------------------
diff --git a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapRegistryService.java b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapRegistryService.java
index 5917156..2b4516b 100644
--- a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapRegistryService.java
+++ b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapRegistryService.java
@@ -18,6 +18,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import com.google.common.base.Preconditions;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
@@ -34,6 +35,8 @@ public class LlapRegistryService extends AbstractService {
 
   private ServiceRegistry registry = null;
   private final boolean isDaemon;
+  private boolean isDynamic = false;
+  private String identity = "(pending)";
 
   private static final Map<String, LlapRegistryService> yarnRegistries = new HashMap<>();
 
@@ -79,8 +82,10 @@ public class LlapRegistryService extends AbstractService {
     String hosts = HiveConf.getTrimmedVar(conf, ConfVars.LLAP_DAEMON_SERVICE_HOSTS);
     if (hosts.startsWith("@")) {
       registry = new LlapZookeeperRegistryImpl(hosts.substring(1), conf);
+      this.isDynamic=true;
     } else {
       registry = new LlapFixedRegistryImpl(hosts, conf);
+      this.isDynamic=false;
     }
     LOG.info("Using LLAP registry type " + registry);
   }
@@ -110,7 +115,7 @@ public class LlapRegistryService extends AbstractService {
 
   private void registerWorker() throws IOException {
     if (this.registry != null) {
-      this.registry.register();
+      this.identity = this.registry.register();
     }
   }
 
@@ -128,4 +133,14 @@ public class LlapRegistryService extends AbstractService {
       throws IOException {
     this.registry.registerStateChangeListener(listener);
   }
+
+  // is the registry dynamic (i.e refreshes?)
+  public boolean isDynamic() {
+    return isDynamic;
+  }
+
+  // this is only useful for the daemons to know themselves
+  public String getWorkerIdentity() {
+    return identity;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapZookeeperRegistryImpl.java
----------------------------------------------------------------------
diff --git a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapZookeeperRegistryImpl.java b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapZookeeperRegistryImpl.java
index ba38fb8..3538bb2 100644
--- a/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapZookeeperRegistryImpl.java
+++ b/llap-client/src/java/org/apache/hadoop/hive/llap/registry/impl/LlapZookeeperRegistryImpl.java
@@ -239,7 +239,7 @@ public class LlapZookeeperRegistryImpl implements ServiceRegistry {
   }
 
   @Override
-  public void register() throws IOException {
+  public String register() throws IOException {
     ServiceRecord srv = new ServiceRecord();
     Endpoint rpcEndpoint = getRpcEndpoint();
     srv.addInternalEndpoint(rpcEndpoint);
@@ -294,6 +294,7 @@ public class LlapZookeeperRegistryImpl implements ServiceRegistry {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Created zknode with path: {} service record: {}", znodePath, srv);
     }
+    return uniq.toString();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/LlapDaemon.java
----------------------------------------------------------------------
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/LlapDaemon.java b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/LlapDaemon.java
index 8600832..768aa8a 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/LlapDaemon.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/impl/LlapDaemon.java
@@ -208,11 +208,13 @@ public class LlapDaemon extends CompositeService implements ContainerRunner, Lla
         amReporter, executorClassLoader);
     addIfService(containerRunner);
 
+    // Not adding the registry as a service, since we need to control when it is initialized - conf used to pickup properties.
+    this.registry = new LlapRegistryService(true);
 
     if (HiveConf.getBoolVar(daemonConf, HiveConf.ConfVars.HIVE_IN_TEST)) {
       this.webServices = null;
     } else {
-      this.webServices = new LlapWebServices(webPort);
+      this.webServices = new LlapWebServices(webPort, this, registry);
       addIfService(webServices);
     }
     // Bring up the server only after all other components have started.
@@ -220,9 +222,6 @@ public class LlapDaemon extends CompositeService implements ContainerRunner, Lla
     // AMReporter after the server so that it gets the correct address. It knows how to deal with
     // requests before it is started.
     addIfService(amReporter);
-
-    // Not adding the registry as a service, since we need to control when it is initialized - conf used to pickup properties.
-    this.registry = new LlapRegistryService(true);
   }
 
   private void initializeLogging() {

http://git-wip-us.apache.org/repos/asf/hive/blob/be20e602/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
----------------------------------------------------------------------
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
index e4c622e..d0be9a7 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
@@ -18,14 +18,32 @@
 package org.apache.hadoop.hive.llap.daemon.services.impl;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+
+import javax.management.MalformedObjectNameException;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.classification.InterfaceAudience;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.apache.hadoop.hive.llap.registry.ServiceInstance;
+import org.apache.hadoop.hive.llap.registry.impl.LlapRegistryService;
+import org.apache.hadoop.hive.llap.registry.impl.LlapZookeeperRegistryImpl;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.service.AbstractService;
+import org.apache.hadoop.service.CompositeService;
+import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hive.common.util.HiveVersionInfo;
 import org.apache.hive.http.HttpServer;
+import org.codehaus.jackson.JsonFactory;
+import org.codehaus.jackson.JsonGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,14 +51,26 @@ public class LlapWebServices extends AbstractService {
 
   private static final Logger LOG = LoggerFactory.getLogger(LlapWebServices.class);
 
+  // this is what allows the UI to do cross-domain reads of the contents
+  // only apply to idempotent GET ops (all others need crumbs)
+  static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
+  static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
+
+  static final String REGISTRY_ATTRIBUTE="llap.registry";
+  static final String PARENT_ATTRIBUTE="llap.parent";
+
   private int port;
   private HttpServer http;
   private boolean useSSL = false;
   private boolean useSPNEGO = false;
+  private final CompositeService parent;
+  private final LlapRegistryService registry;
 
-  public LlapWebServices(int port) {
+  public LlapWebServices(int port, CompositeService parent, LlapRegistryService registry) {
     super("LlapWebServices");
     this.port = port;
+    this.registry = registry;
+    this.parent = parent;
   }
 
   @Override
@@ -63,8 +93,13 @@ public class LlapWebServices extends AbstractService {
       }
     }
 
+    builder.setContextAttribute(REGISTRY_ATTRIBUTE, registry);
+    builder.setContextAttribute(PARENT_ATTRIBUTE, parent);
+
     try {
       this.http = builder.build();
+      this.http.addServlet("status", "/status", LlapStatusServlet.class);
+      this.http.addServlet("peers", "/peers", LlapPeerRegistryServlet.class);
     } catch (IOException e) {
       LOG.warn("LLAP web service failed to come up", e);
     }
@@ -88,4 +123,141 @@ public class LlapWebServices extends AbstractService {
       this.http.stop();
     }
   }
+
+  public static class LlapStatusServlet extends HttpServlet {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Possible values: UNKNOWN, NOTINITED, INITED, STARTED, STOPPED
+     */
+    private static final String STATUS_ATTRIBUTE = "status";
+    private static final String UPTIME_ATTRIBUTE = "uptime";
+    private static final String BUILD_ATTRIBUTE = "build";
+
+    private static final String UNKNOWN_STATE = "UNKNOWN";
+
+    protected transient JsonFactory jsonFactory;
+
+    protected RuntimeMXBean runtimeBean;
+
+    @Override
+    public void init() throws ServletException {
+      jsonFactory = new JsonFactory();
+      runtimeBean = ManagementFactory.getRuntimeMXBean();
+    }
+
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response) {
+      JsonGenerator jg = null;
+      PrintWriter writer = null;
+      final ServletContext context = getServletContext();
+      final Object parent = context.getAttribute(PARENT_ATTRIBUTE);
+
+      final long uptime = runtimeBean.getUptime();
+
+      try {
+        try {
+          writer = response.getWriter();
+
+          response.setContentType("application/json; charset=utf8");
+          response.setHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET");
+          response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
+          jg = jsonFactory.createJsonGenerator(writer);
+          jg.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
+          jg.useDefaultPrettyPrinter();
+          jg.writeStartObject();
+          if (parent != null && parent instanceof CompositeService) {
+            jg.writeStringField(STATUS_ATTRIBUTE, ((CompositeService) parent).getServiceState()
+                .toString());
+          } else {
+            jg.writeStringField(STATUS_ATTRIBUTE, UNKNOWN_STATE);
+          }
+          jg.writeNumberField(UPTIME_ATTRIBUTE, uptime);
+          jg.writeStringField(BUILD_ATTRIBUTE, HiveVersionInfo.getBuildVersion());
+          jg.writeEndObject();
+        } finally {
+          if (jg != null) {
+            jg.close();
+          }
+          if (writer != null) {
+            writer.close();
+          }
+        }
+      } catch (IOException e) {
+        LOG.error("Caught an exception while processing /status request", e);
+        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      }
+    }
+  }
+
+  public static class LlapPeerRegistryServlet extends HttpServlet {
+    private static final long serialVersionUID = 1L;
+    protected transient JsonFactory jsonFactory;
+
+    @Override
+    public void init() throws ServletException {
+      jsonFactory = new JsonFactory();
+    }
+    
+    @Override
+    public void doGet(HttpServletRequest request, HttpServletResponse response) {
+      JsonGenerator jg = null;
+      PrintWriter writer = null;
+      final ServletContext context = getServletContext();
+      final LlapRegistryService registry = (LlapRegistryService)context.getAttribute(REGISTRY_ATTRIBUTE);
+
+      try {
+        // admin check
+        if (!HttpServer.isInstrumentationAccessAllowed(context, request, response)) {
+          return;
+        }
+        try {
+          writer = response.getWriter();
+
+          response.setContentType("application/json; charset=utf8");
+          response.setHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET");
+          response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
+          jg = jsonFactory.createJsonGenerator(writer);
+          jg.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
+          jg.useDefaultPrettyPrinter();
+          jg.writeStartObject();
+          if (registry.isDynamic()) {
+            jg.writeBooleanField("dynamic", true);
+          }
+          jg.writeStringField("identity", registry.getWorkerIdentity());
+          jg.writeArrayFieldStart("peers");
+          for (ServiceInstance s : registry.getInstances().getAllInstancesOrdered()) {
+            jg.writeStartObject();
+            jg.writeStringField("identity", s.getWorkerIdentity());
+            jg.writeStringField("host", s.getHost());
+            jg.writeNumberField("management-port", s.getManagementPort());
+            jg.writeNumberField("rpc-port", s.getRpcPort());
+            jg.writeNumberField("shuffle-port", s.getShufflePort());
+            Resource r = s.getResource();
+            if (r != null) {
+              jg.writeObjectFieldStart("resource");
+              jg.writeNumberField("vcores", r.getVirtualCores());
+              jg.writeNumberField("memory", r.getMemory());
+              jg.writeEndObject();
+            }
+            jg.writeStringField("host", s.getHost());
+            jg.writeEndObject();
+          }
+          jg.writeEndArray();
+          jg.writeEndObject();
+        } finally {
+          if (jg != null) {
+            jg.close();
+          }
+          if (writer != null) {
+            writer.close();
+          }
+        }
+      } catch (IOException e) {
+        LOG.error("Caught an exception while processing /status request", e);
+        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      }
+    }
+  }
+
 }


[2/3] hive git commit: HIVE-13436. Allow the package directory to be specified for the llap setup script. (Siddharth Seth, reviewed by Sergey Shelukhin)

Posted by ss...@apache.org.
HIVE-13436. Allow the package directory to be specified for the llap setup script. (Siddharth Seth, 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/23908230
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/23908230
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/23908230

Branch: refs/heads/master
Commit: 23908230bcd5a444f1a9e0702daec083f2f48f57
Parents: be20e60
Author: Siddharth Seth <ss...@apache.org>
Authored: Fri Apr 8 14:36:19 2016 -0700
Committer: Siddharth Seth <ss...@apache.org>
Committed: Fri Apr 8 14:36:19 2016 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java   | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/23908230/llap-server/src/java/org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java
----------------------------------------------------------------------
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java b/llap-server/src/java/org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java
index 418f77f..dd908fc 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/cli/LlapOptionsProcessor.java
@@ -61,6 +61,7 @@ public class LlapOptionsProcessor {
   public static final String OPTION_SLIDER_KEYTAB = "slider-keytab";
   public static final String OPTION_SLIDER_PRINCIPAL = "slider-principal";
   public static final String OPTION_SLIDER_DEFAULT_KEYTAB = "slider-default-keytab";
+  public static final String OPTION_OUTPUT_DIR = "output";
 
 
   public class LlapOptions {
@@ -208,6 +209,10 @@ public class LlapOptionsProcessor {
         .withLongOpt(OPTION_LLAP_QUEUE)
         .withDescription("The queue within which LLAP will be started").create('q'));
 
+    options.addOption(OptionBuilder.hasArg().withArgName(OPTION_OUTPUT_DIR)
+        .withLongOpt(OPTION_OUTPUT_DIR)
+        .withDescription("Output directory for the generated scripts").create());
+
     options.addOption(OptionBuilder.hasArg().withArgName(OPTION_AUXJARS).withLongOpt(OPTION_AUXJARS)
         .withDescription("additional jars to package (by default, JSON SerDe jar is packaged"
             + " if available)").create('j'));


[3/3] hive git commit: HIVE-13437. httpserver getPort does not return the actual port when attempting to use a dynamic port. (Siddharth Seth, reviewed by Prasanth Jayachandran and Sergey Shelukhin)

Posted by ss...@apache.org.
HIVE-13437. httpserver getPort does not return the actual port when attempting to use a dynamic port. (Siddharth Seth, reviewed by Prasanth Jayachandran and Sergey Shelukhin)


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

Branch: refs/heads/master
Commit: 9a00b2f4c430e6c85c824ac8f4e7a128c551df1a
Parents: 2390823
Author: Siddharth Seth <ss...@apache.org>
Authored: Fri Apr 8 14:38:34 2016 -0700
Committer: Siddharth Seth <ss...@apache.org>
Committed: Fri Apr 8 14:38:34 2016 -0700

----------------------------------------------------------------------
 .../java/org/apache/hive/http/HttpServer.java   | 25 +++++++++++++-------
 .../daemon/services/impl/LlapWebServices.java   |  2 +-
 .../apache/hive/service/server/HiveServer2.java |  4 ++--
 3 files changed, 19 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/9a00b2f4/common/src/java/org/apache/hive/http/HttpServer.java
----------------------------------------------------------------------
diff --git a/common/src/java/org/apache/hive/http/HttpServer.java b/common/src/java/org/apache/hive/http/HttpServer.java
index 0aa9c89..32956b1 100644
--- a/common/src/java/org/apache/hive/http/HttpServer.java
+++ b/common/src/java/org/apache/hive/http/HttpServer.java
@@ -30,6 +30,7 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.google.common.base.Preconditions;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
 import org.apache.hadoop.hive.conf.HiveConf;
@@ -66,16 +67,20 @@ import org.eclipse.jetty.webapp.WebAppContext;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.Sets;
+import org.slf4j.LoggerFactory;
 
 /**
  * A simple embedded Jetty server to serve as HS2/HMS web UI.
  */
 public class HttpServer {
+
+  private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(HttpServer.class);
+
   public static final String CONF_CONTEXT_ATTRIBUTE = "hive.conf";
   public static final String ADMINS_ACL = "admins.acl";
 
+  private final String name;
   private final String appDir;
-  private final int port;
   private final WebAppContext webAppContext;
   private final Server webServer;
 
@@ -83,7 +88,7 @@ public class HttpServer {
    * Create a status server on the given port.
    */
   private HttpServer(final Builder b) throws IOException {
-    this.port = b.port;
+    this.name = b.name;
 
     webServer = new Server();
     appDir = getWebAppsPath(b.name);
@@ -98,7 +103,7 @@ public class HttpServer {
   }
 
   public static class Builder {
-    private String name;
+    private final String name;
     private String host;
     private int port;
     private int maxThreads;
@@ -111,6 +116,11 @@ public class HttpServer {
     private boolean useSPNEGO;
     private boolean useSSL;
 
+    public Builder(String name) {
+      Preconditions.checkArgument(name != null && !name.isEmpty(), "Name must be specified");
+      this.name = name;
+    }
+
     public HttpServer build() throws IOException {
       return new HttpServer(this);
     }
@@ -121,10 +131,6 @@ public class HttpServer {
       return this;
     }
 
-    public Builder setName(String name) {
-      this.name = name;
-      return this;
-    }
 
     public Builder setHost(String host) {
       this.host = host;
@@ -186,6 +192,7 @@ public class HttpServer {
 
   public void start() throws Exception {
     webServer.start();
+    LOG.info("Started HttpServer[{}] on port {}", name, getPort());
   }
 
   public void stop() throws Exception {
@@ -193,7 +200,7 @@ public class HttpServer {
   }
 
   public int getPort() {
-    return port;
+    return webServer.getConnectors()[0].getLocalPort();
   }
 
   /**
@@ -364,7 +371,7 @@ public class HttpServer {
     // Create the channel connector for the web server
     Connector connector = createChannelConnector(threadPool.getMaxThreads(), b);
     connector.setHost(b.host);
-    connector.setPort(port);
+    connector.setPort(b.port);
     webServer.addConnector(connector);
 
     // Configure web application contexts for the web server

http://git-wip-us.apache.org/repos/asf/hive/blob/9a00b2f4/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
----------------------------------------------------------------------
diff --git a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
index d0be9a7..f85bbf2 100644
--- a/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
+++ b/llap-server/src/java/org/apache/hadoop/hive/llap/daemon/services/impl/LlapWebServices.java
@@ -80,7 +80,7 @@ public class LlapWebServices extends AbstractService {
     this.useSPNEGO = HiveConf.getBoolVar(conf, ConfVars.LLAP_WEB_AUTO_AUTH);
     String bindAddress = "0.0.0.0";
     HttpServer.Builder builder =
-        new HttpServer.Builder().setName("llap").setPort(this.port).setHost(bindAddress);
+        new HttpServer.Builder("llap").setPort(this.port).setHost(bindAddress);
     builder.setConf(new HiveConf(conf, HiveConf.class));
     if (UserGroupInformation.isSecurityEnabled()) {
       LOG.info("LLAP UI useSSL=" + this.useSSL + ", auto-auth/SPNEGO="

http://git-wip-us.apache.org/repos/asf/hive/blob/9a00b2f4/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 d95f78f..882f4ae 100644
--- a/service/src/java/org/apache/hive/service/server/HiveServer2.java
+++ b/service/src/java/org/apache/hive/service/server/HiveServer2.java
@@ -142,8 +142,8 @@ public class HiveServer2 extends CompositeService {
         if (webUIPort <= 0) {
           LOG.info("Web UI is disabled since port is set to " + webUIPort);
         } else {
-          HttpServer.Builder builder = new HttpServer.Builder();
-          builder.setName("hiveserver2").setPort(webUIPort).setConf(hiveConf);
+          HttpServer.Builder builder = new HttpServer.Builder("hiveserver2");
+          builder.setPort(webUIPort).setConf(hiveConf);
           builder.setHost(hiveConf.getVar(ConfVars.HIVE_SERVER2_WEBUI_BIND_HOST));
           builder.setMaxThreads(
             hiveConf.getIntVar(ConfVars.HIVE_SERVER2_WEBUI_MAX_THREADS));