YARN-5698. [YARN-3368] Launch new YARN UI under hadoop web app port. (Sunil G via wangda)

This commit is contained in:
Wangda Tan 2016-10-12 13:22:20 -07:00
parent 98b2ad7208
commit 3de0da2a76
5 changed files with 56 additions and 67 deletions

View File

@ -266,25 +266,12 @@ private static void addDeprecatedKeys() {
/**
* Enable YARN WebApp V2.
*/
public static final String RM_WEBAPP_UI2_ENABLE = RM_PREFIX
public static final String YARN_WEBAPP_UI2_ENABLE = "yarn."
+ "webapp.ui2.enable";
public static final boolean DEFAULT_RM_WEBAPP_UI2_ENABLE = false;
public static final boolean DEFAULT_YARN_WEBAPP_UI2_ENABLE = false;
/** The address of the RM web ui2 application. */
public static final String RM_WEBAPP_UI2_ADDRESS = RM_PREFIX
+ "webapp.ui2.address";
public static final int DEFAULT_RM_WEBAPP_UI2_PORT = 8288;
public static final String DEFAULT_RM_WEBAPP_UI2_ADDRESS = "0.0.0.0:" +
DEFAULT_RM_WEBAPP_UI2_PORT;
/** The https address of the RM web ui2 application.*/
public static final String RM_WEBAPP_UI2_HTTPS_ADDRESS =
RM_PREFIX + "webapp.ui2.https.address";
public static final int DEFAULT_RM_WEBAPP_UI2_HTTPS_PORT = 8290;
public static final String DEFAULT_RM_WEBAPP_UI2_HTTPS_ADDRESS = "0.0.0.0:"
+ DEFAULT_RM_WEBAPP_UI2_HTTPS_PORT;
public static final String YARN_WEBAPP_UI2_WARFILE_PATH = "yarn."
+ "webapp.ui2.war-file-path";
public static final String RM_RESOURCE_TRACKER_ADDRESS =
RM_PREFIX + "resource-tracker.address";

View File

@ -43,6 +43,7 @@
import org.apache.hadoop.security.http.XFrameOptionsFilter;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
import org.mortbay.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -369,8 +370,15 @@ public WebApp start() {
}
public WebApp start(WebApp webapp) {
return start(webapp, null);
}
public WebApp start(WebApp webapp, WebAppContext ui2Context) {
WebApp webApp = build(webapp);
HttpServer2 httpServer = webApp.httpServer();
if (ui2Context != null) {
httpServer.addContext(ui2Context, true);
}
try {
httpServer.start();
LOG.info("Web app " + name + " started at "

View File

@ -181,28 +181,16 @@
<property>
<description>To enable RM web ui2 application.</description>
<name>yarn.resourcemanager.webapp.ui2.enable</name>
<name>yarn.webapp.ui2.enable</name>
<value>false</value>
</property>
<property>
<description>
The http address of the RM web ui2 application.
If only a host is provided as the value,
the webapp will be served on a random port.
Explicitly provide WAR file path for ui2 if needed.
</description>
<name>yarn.resourcemanager.webapp.ui2.address</name>
<value>${yarn.resourcemanager.hostname}:8288</value>
</property>
<property>
<description>
The https address of the RM web ui2 application.
If only a host is provided as the value,
the webapp will be served on a random port.
</description>
<name>yarn.resourcemanager.webapp.ui2.https.address</name>
<value>${yarn.resourcemanager.hostname}:8290</value>
<name>yarn.webapp.ui2.war-file-path</name>
<value></value>
</property>
<property>

View File

@ -49,6 +49,7 @@
import org.apache.hadoop.util.ReflectionUtils;
import org.apache.hadoop.util.ShutdownHookManager;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.VersionInfo;
import org.apache.hadoop.util.ZKUtil;
import org.apache.hadoop.yarn.YarnUncaughtExceptionHandler;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
@ -114,6 +115,7 @@
import org.apache.hadoop.yarn.webapp.WebApps.Builder;
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
import org.mortbay.jetty.webapp.WebAppContext;
import com.google.common.annotations.VisibleForTesting;
import java.io.IOException;
@ -121,6 +123,8 @@
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.Charset;
import java.security.PrivilegedExceptionAction;
import java.security.SecureRandom;
@ -148,6 +152,11 @@ public class ResourceManager extends CompositeService implements Recoverable {
private static final Log LOG = LogFactory.getLog(ResourceManager.class);
private static long clusterTimeStamp = System.currentTimeMillis();
/*
* UI2 webapp name
*/
public static final String UI2_WEBAPP_NAME = "/ui2";
/**
* "Always On" services. Services that need to run always irrespective of
* the HA state of the RM.
@ -940,26 +949,6 @@ public static HttpServer2.Builder httpServerTemplateForRM(Configuration conf,
return builder;
}
protected void startWebAppV2() throws IOException {
Configuration config = getConfig();
final InetSocketAddress httpAddr = config.getSocketAddr(
YarnConfiguration.RM_WEBAPP_UI2_ADDRESS,
YarnConfiguration.DEFAULT_RM_WEBAPP_UI2_ADDRESS,
YarnConfiguration.DEFAULT_RM_WEBAPP_UI2_PORT);
final InetSocketAddress httpsAddr = config.getSocketAddr(
YarnConfiguration.RM_WEBAPP_UI2_HTTPS_ADDRESS,
YarnConfiguration.DEFAULT_RM_WEBAPP_UI2_HTTPS_ADDRESS,
YarnConfiguration.DEFAULT_RM_WEBAPP_UI2_HTTPS_PORT);
HttpServer2.Builder builder = httpServerTemplateForRM(config, httpAddr,
httpsAddr, "rm");
HttpServer2 infoServer = builder.build();
infoServer.start();
LOG.info("Web server init done");
}
protected void startWepApp() {
// Use the customized yarn filter instead of the standard kerberos filter to
@ -1074,9 +1063,36 @@ protected void startWepApp() {
builder.withAttribute(WebAppProxy.FETCHER_ATTRIBUTE, fetcher);
String[] proxyParts = proxyHostAndPort.split(":");
builder.withAttribute(WebAppProxy.PROXY_HOST_ATTRIBUTE, proxyParts[0]);
}
webApp = builder.start(new RMWebApp(this));
WebAppContext uiWebAppContext = null;
if (getConfig().getBoolean(YarnConfiguration.YARN_WEBAPP_UI2_ENABLE,
YarnConfiguration.DEFAULT_YARN_WEBAPP_UI2_ENABLE)) {
String webPath = UI2_WEBAPP_NAME;
String onDiskPath = getConfig()
.get(YarnConfiguration.YARN_WEBAPP_UI2_WARFILE_PATH);
if (null == onDiskPath) {
String war = "hadoop-yarn-ui-" + VersionInfo.getVersion() + ".war";
URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL url = cl.findResource(war);
if (null == url) {
onDiskPath = "";
} else {
onDiskPath = url.getFile();
}
LOG.info(
"New web UI war file name:" + war + ", and path:" + onDiskPath);
}
uiWebAppContext = new WebAppContext();
uiWebAppContext.setContextPath(webPath);
uiWebAppContext.setWar(onDiskPath);
}
webApp = builder.start(new RMWebApp(this), uiWebAppContext);
}
/**
@ -1178,16 +1194,6 @@ protected void serviceStart() throws Exception {
transitionToActive();
}
if (getConfig().getBoolean(YarnConfiguration.RM_WEBAPP_UI2_ENABLE,
YarnConfiguration.DEFAULT_RM_WEBAPP_UI2_ENABLE)) {
try {
startWebAppV2();
LOG.info("Yarn WebApp UI 2 is started");
} catch (Exception e) {
LOG.error("Failed to start Yarn web app v2:" + e.getMessage());
}
}
startWepApp();
if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER,
false)) {

View File

@ -18,7 +18,7 @@
module.exports = { // Yarn UI App configurations
hosts: {
localBaseAddress: "localhost:1337",
localBaseAddress: "",
timelineWebAddress: "localhost:8188",
rmWebAddress: "localhost:8088",
protocolScheme: "http:"
@ -29,4 +29,4 @@ module.exports = { // Yarn UI App configurations
metrics: 'ws/v1/cluster/metrics',
node: 'ws/v1/node'
},
};
};