YARN-2795. Fixed ResourceManager to not crash loading node-label data from HDFS in secure mode. Contributed by Wangda Tan.

(cherry picked from commit ec6cbece8e)
This commit is contained in:
Vinod Kumar Vavilapalli 2014-11-03 13:44:06 -08:00
parent c1ba223009
commit 277141b82d
5 changed files with 36 additions and 23 deletions

View File

@ -819,6 +819,9 @@ Release 2.6.0 - UNRELEASED
that were caused when adding log-upload-time via YARN-2703. (Xuan Gong via that were caused when adding log-upload-time via YARN-2703. (Xuan Gong via
vinodkv) vinodkv)
YARN-2795. Fixed ResourceManager to not crash loading node-label data from
HDFS in secure mode. (Wangda Tan via vinodkv)
Release 2.5.1 - 2014-09-05 Release 2.5.1 - 2014-09-05
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -23,9 +23,7 @@
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -196,6 +194,16 @@ protected void serviceInit(Configuration conf) throws Exception {
this.conf = conf; this.conf = conf;
this.rmContext = new RMContextImpl(); this.rmContext = new RMContextImpl();
// Set UGI and do login
// If security is enabled, use login user
// If security is not enabled, use current user
this.rmLoginUGI = UserGroupInformation.getCurrentUser();
try {
doSecureLogin();
} catch(IOException ie) {
throw new YarnRuntimeException("Failed to login", ie);
}
this.configurationProvider = this.configurationProvider =
ConfigurationProviderFactory.getConfigurationProvider(conf); ConfigurationProviderFactory.getConfigurationProvider(conf);
this.configurationProvider.init(this.conf); this.configurationProvider.init(this.conf);
@ -242,14 +250,13 @@ protected void serviceInit(Configuration conf) throws Exception {
if (this.rmContext.isHAEnabled()) { if (this.rmContext.isHAEnabled()) {
HAUtil.verifyAndSetConfiguration(this.conf); HAUtil.verifyAndSetConfiguration(this.conf);
} }
createAndInitActiveServices(); createAndInitActiveServices();
webAppAddress = WebAppUtils.getWebAppBindURL(this.conf, webAppAddress = WebAppUtils.getWebAppBindURL(this.conf,
YarnConfiguration.RM_BIND_HOST, YarnConfiguration.RM_BIND_HOST,
WebAppUtils.getRMWebAppURLWithoutScheme(this.conf)); WebAppUtils.getRMWebAppURLWithoutScheme(this.conf));
this.rmLoginUGI = UserGroupInformation.getCurrentUser();
super.serviceInit(this.conf); super.serviceInit(this.conf);
} }
@ -1019,17 +1026,13 @@ protected boolean areActiveServicesRunning() {
} }
synchronized void transitionToActive() throws Exception { synchronized void transitionToActive() throws Exception {
if (rmContext.getHAServiceState() == if (rmContext.getHAServiceState() == HAServiceProtocol.HAServiceState.ACTIVE) {
HAServiceProtocol.HAServiceState.ACTIVE) {
LOG.info("Already in active state"); LOG.info("Already in active state");
return; return;
} }
LOG.info("Transitioning to active state"); LOG.info("Transitioning to active state");
// use rmLoginUGI to startActiveServices.
// in non-secure model, rmLoginUGI will be current UGI
// in secure model, rmLoginUGI will be LoginUser UGI
this.rmLoginUGI.doAs(new PrivilegedExceptionAction<Void>() { this.rmLoginUGI.doAs(new PrivilegedExceptionAction<Void>() {
@Override @Override
public Void run() throws Exception { public Void run() throws Exception {
@ -1071,12 +1074,6 @@ synchronized void transitionToStandby(boolean initialize)
@Override @Override
protected void serviceStart() throws Exception { protected void serviceStart() throws Exception {
try {
doSecureLogin();
} catch(IOException ie) {
throw new YarnRuntimeException("Failed to login", ie);
}
if (this.rmContext.isHAEnabled()) { if (this.rmContext.isHAEnabled()) {
transitionToStandby(true); transitionToStandby(true);
} else { } else {
@ -1084,7 +1081,8 @@ protected void serviceStart() throws Exception {
} }
startWepApp(); startWepApp();
if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, false)) { if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER,
false)) {
int port = webApp.port(); int port = webApp.port();
WebAppUtils.setRMWebAppPort(conf, port); WebAppUtils.setRMWebAppPort(conf, port);
} }

View File

@ -28,8 +28,6 @@
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import org.junit.Assert;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
@ -37,10 +35,10 @@
import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState; import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.apache.hadoop.ha.HAServiceProtocol.StateChangeRequestInfo; import org.apache.hadoop.ha.HAServiceProtocol.StateChangeRequestInfo;
import org.apache.hadoop.ha.HealthCheckFailedException; import org.apache.hadoop.ha.HealthCheckFailedException;
import org.apache.hadoop.metrics2.MetricsSystem;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.net.NetUtils;
import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.service.AbstractService; import org.apache.hadoop.service.AbstractService;
import org.apache.hadoop.yarn.conf.HAUtil; import org.apache.hadoop.yarn.conf.HAUtil;
import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.conf.YarnConfiguration;
@ -54,6 +52,7 @@
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject; import org.codehaus.jettison.json.JSONObject;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -64,7 +63,7 @@
public class TestRMHA { public class TestRMHA {
private Log LOG = LogFactory.getLog(TestRMHA.class); private Log LOG = LogFactory.getLog(TestRMHA.class);
private final Configuration configuration = new YarnConfiguration(); private Configuration configuration;
private MockRM rm = null; private MockRM rm = null;
private RMApp app = null; private RMApp app = null;
private RMAppAttempt attempt = null; private RMAppAttempt attempt = null;
@ -82,6 +81,8 @@ public class TestRMHA {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
configuration = new Configuration();
UserGroupInformation.setConfiguration(configuration);
configuration.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); configuration.setBoolean(YarnConfiguration.RM_HA_ENABLED, true);
configuration.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," configuration.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + ","
+ RM2_NODE_ID); + RM2_NODE_ID);

View File

@ -57,6 +57,7 @@ public class TestResourceManager {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Configuration conf = new YarnConfiguration(); Configuration conf = new YarnConfiguration();
UserGroupInformation.setConfiguration(conf);
resourceManager = new ResourceManager(); resourceManager = new ResourceManager();
resourceManager.init(conf); resourceManager.init(conf);
resourceManager.getRMContext().getContainerTokenSecretManager().rollMasterKey(); resourceManager.getRMContext().getContainerTokenSecretManager().rollMasterKey();
@ -254,7 +255,12 @@ public void testFilterOverrides() throws Exception {
AuthenticationFilterInitializer.class.getName() + ", " AuthenticationFilterInitializer.class.getName() + ", "
+ this.getClass().getName() }; + this.getClass().getName() };
for (String filterInitializer : filterInitializers) { for (String filterInitializer : filterInitializers) {
resourceManager = new ResourceManager(); resourceManager = new ResourceManager() {
@Override
protected void doSecureLogin() throws IOException {
// Skip the login.
}
};
Configuration conf = new YarnConfiguration(); Configuration conf = new YarnConfiguration();
conf.set(filterInitializerConfKey, filterInitializer); conf.set(filterInitializerConfKey, filterInitializer);
conf.set("hadoop.security.authentication", "kerberos"); conf.set("hadoop.security.authentication", "kerberos");

View File

@ -808,7 +808,12 @@ public void testAppSubmissionWithInvalidDelegationToken() throws Exception {
CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION, CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION,
"kerberos"); "kerberos");
UserGroupInformation.setConfiguration(conf); UserGroupInformation.setConfiguration(conf);
MockRM rm = new MockRM(conf); MockRM rm = new MockRM(conf) {
@Override
protected void doSecureLogin() throws IOException {
// Skip the login.
}
};
ByteBuffer tokens = ByteBuffer.wrap("BOGUS".getBytes()); ByteBuffer tokens = ByteBuffer.wrap("BOGUS".getBytes());
ContainerLaunchContext amContainer = ContainerLaunchContext amContainer =
ContainerLaunchContext.newInstance( ContainerLaunchContext.newInstance(