diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
index 72cc0d6451..d84d11acbc 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java
@@ -2302,13 +2302,17 @@ public static boolean isAclEnabled(Configuration conf) {
/** Keytab for Proxy.*/
public static final String PROXY_KEYTAB = PROXY_PREFIX + "keytab";
-
+
/** The address for the web proxy.*/
public static final String PROXY_ADDRESS =
PROXY_PREFIX + "address";
public static final int DEFAULT_PROXY_PORT = 9099;
public static final String DEFAULT_PROXY_ADDRESS =
"0.0.0.0:" + DEFAULT_PROXY_PORT;
+
+ /** Binding address for the web proxy. */
+ public static final String PROXY_BIND_HOST =
+ PROXY_PREFIX + "bind-host";
/**
* YARN Service Level Authorization
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
index ccceaab05b..12c5ff6cc4 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml
@@ -2157,6 +2157,15 @@
+
+ The actual address the web proxy will bind to. If this optional
+ address is set, it overrides only the hostname portion of yarn.web-proxy.address.
+ This is useful for making the web proxy server listen on all interfaces by setting
+ it to 0.0.0.0
+ yarn.web-proxy.bind-host
+
+
+
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxy.java
index f205cf7dfe..1382fc6ce1 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxy.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxy.java
@@ -74,16 +74,26 @@ protected void serviceInit(Configuration conf) throws Exception {
fetcher = new AppReportFetcher(conf);
bindAddress = conf.get(YarnConfiguration.PROXY_ADDRESS);
if(bindAddress == null || bindAddress.isEmpty()) {
- throw new YarnRuntimeException(YarnConfiguration.PROXY_ADDRESS +
+ throw new YarnRuntimeException(YarnConfiguration.PROXY_ADDRESS +
" is not set so the proxy will not run.");
}
- LOG.info("Instantiating Proxy at " + bindAddress);
+
String[] parts = StringUtils.split(bindAddress, ':');
port = 0;
if (parts.length == 2) {
bindAddress = parts[0];
port = Integer.parseInt(parts[1]);
}
+
+ String bindHost = conf.getTrimmed(YarnConfiguration.PROXY_BIND_HOST, null);
+ if (bindHost != null) {
+ LOG.debug("{} is set, will be used to run proxy.",
+ YarnConfiguration.PROXY_BIND_HOST);
+ bindAddress = bindHost;
+ }
+
+ LOG.info("Instantiating Proxy at {}:{}", bindAddress, port);
+
acl = new AccessControlList(conf.get(YarnConfiguration.YARN_ADMIN_ACL,
YarnConfiguration.DEFAULT_YARN_ADMIN_ACL));
super.serviceInit(conf);
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxyServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxyServer.java
index a5dd8f6850..6be6039e6d 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxyServer.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/main/java/org/apache/hadoop/yarn/server/webproxy/WebAppProxyServer.java
@@ -38,7 +38,7 @@
/**
* ProxyServer will sit in between the end user and AppMaster
- * web interfaces.
+ * web interfaces.
*/
public class WebAppProxyServer extends CompositeService {
@@ -103,9 +103,11 @@ protected void doSecureLogin(Configuration conf) throws IOException {
* @return InetSocketAddress
*/
public static InetSocketAddress getBindAddress(Configuration conf) {
- return conf.getSocketAddr(YarnConfiguration.PROXY_ADDRESS,
- YarnConfiguration.DEFAULT_PROXY_ADDRESS,
- YarnConfiguration.DEFAULT_PROXY_PORT);
+ return conf.getSocketAddr(
+ YarnConfiguration.PROXY_BIND_HOST,
+ YarnConfiguration.PROXY_ADDRESS,
+ YarnConfiguration.DEFAULT_PROXY_ADDRESS,
+ YarnConfiguration.DEFAULT_PROXY_PORT);
}
public static void main(String[] args) {
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestWebAppProxyServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestWebAppProxyServer.java
index 93479a9b42..87907a64f2 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestWebAppProxyServer.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-web-proxy/src/test/java/org/apache/hadoop/yarn/server/webproxy/TestWebAppProxyServer.java
@@ -23,7 +23,6 @@
import org.apache.hadoop.service.Service;
import org.apache.hadoop.service.Service.STATE;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.hadoop.yarn.server.webproxy.WebAppProxyServer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -33,14 +32,15 @@
public class TestWebAppProxyServer {
private WebAppProxyServer webAppProxy = null;
- private final String proxyAddress = "0.0.0.0:8888";
+ private final String port = "8888";
+ private final String proxyAddress = "localhost:" + port;
+ private YarnConfiguration conf = null;
@Before
public void setUp() throws Exception {
- YarnConfiguration conf = new YarnConfiguration();
+ conf = new YarnConfiguration();
conf.set(YarnConfiguration.PROXY_ADDRESS, proxyAddress);
webAppProxy = new WebAppProxyServer();
- webAppProxy.init(conf);
}
@After
@@ -50,19 +50,38 @@ public void tearDown() throws Exception {
@Test
public void testStart() {
+ webAppProxy.init(conf);
assertEquals(STATE.INITED, webAppProxy.getServiceState());
webAppProxy.start();
for (Service service : webAppProxy.getServices()) {
if (service instanceof WebAppProxy) {
- assertEquals(((WebAppProxy) service).getBindAddress(), proxyAddress);
+ assertEquals(proxyAddress, ((WebAppProxy) service).getBindAddress());
}
}
assertEquals(STATE.STARTED, webAppProxy.getServiceState());
}
+ @Test
+ public void testStartWithBindHost() {
+ String bindHost = "0.0.0.0";
+ conf.set(YarnConfiguration.PROXY_BIND_HOST, bindHost);
+ webAppProxy.init(conf);
+
+ assertEquals(STATE.INITED, webAppProxy.getServiceState());
+ webAppProxy.start();
+ for (Service service : webAppProxy.getServices()) {
+ if (service instanceof WebAppProxy) {
+ assertEquals(bindHost + ":" + port,
+ ((WebAppProxy) service).getBindAddress());
+ }
+ }
+ assertEquals(STATE.STARTED, webAppProxy.getServiceState());
+ }
+
+
@Test
public void testBindAddress() {
- YarnConfiguration conf = new YarnConfiguration();
+ conf = new YarnConfiguration();
InetSocketAddress defaultBindAddress = WebAppProxyServer.getBindAddress(conf);
Assert.assertEquals("Web Proxy default bind address port is incorrect",