|
@@ -24,7 +24,6 @@ import java.util.concurrent.ConcurrentMap;
|
|
|
import org.apache.hadoop.classification.InterfaceAudience.Private;
|
|
|
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
-import org.apache.hadoop.ha.HAServiceProtocol;
|
|
|
import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
|
|
|
import org.apache.hadoop.yarn.LocalConfigurationProvider;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
@@ -57,37 +56,39 @@ import org.apache.hadoop.yarn.util.Clock;
|
|
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
|
|
|
+/**
|
|
|
+ * RMContextImpl class holds two services context.
|
|
|
+ * <ul>
|
|
|
+ * <li>serviceContext : These services called as <b>Always On</b> services.
|
|
|
+ * Services that need to run always irrespective of the HA state of the RM.</li>
|
|
|
+ * <li>activeServiceCotext : Active services context. Services that need to run
|
|
|
+ * only on the Active RM.</li>
|
|
|
+ * </ul>
|
|
|
+ * <p>
|
|
|
+ * <b>Note:</b> If any new service to be added to context, add it to a right
|
|
|
+ * context as per above description.
|
|
|
+ */
|
|
|
public class RMContextImpl implements RMContext {
|
|
|
|
|
|
- private Dispatcher rmDispatcher;
|
|
|
-
|
|
|
- private boolean isHAEnabled;
|
|
|
-
|
|
|
- private HAServiceState haServiceState =
|
|
|
- HAServiceProtocol.HAServiceState.INITIALIZING;
|
|
|
-
|
|
|
- private AdminService adminService;
|
|
|
-
|
|
|
- private ConfigurationProvider configurationProvider;
|
|
|
+ /**
|
|
|
+ * RM service contexts which runs through out RM life span. These are created
|
|
|
+ * once during start of RM.
|
|
|
+ */
|
|
|
+ private RMServiceContext serviceContext;
|
|
|
|
|
|
+ /**
|
|
|
+ * RM Active service context. This will be recreated for every transition from
|
|
|
+ * ACTIVE->STANDBY.
|
|
|
+ */
|
|
|
private RMActiveServiceContext activeServiceContext;
|
|
|
|
|
|
- private Configuration yarnConfiguration;
|
|
|
-
|
|
|
- private RMApplicationHistoryWriter rmApplicationHistoryWriter;
|
|
|
- private SystemMetricsPublisher systemMetricsPublisher;
|
|
|
- private EmbeddedElector elector;
|
|
|
-
|
|
|
- private QueueLimitCalculator queueLimitCalculator;
|
|
|
-
|
|
|
- private final Object haServiceStateLock = new Object();
|
|
|
-
|
|
|
- private ResourceManager resourceManager;
|
|
|
/**
|
|
|
* Default constructor. To be used in conjunction with setter methods for
|
|
|
* individual fields.
|
|
|
*/
|
|
|
public RMContextImpl() {
|
|
|
+ this.serviceContext = new RMServiceContext();
|
|
|
+ this.activeServiceContext = new RMActiveServiceContext();
|
|
|
}
|
|
|
|
|
|
@VisibleForTesting
|
|
@@ -138,19 +139,154 @@ public class RMContextImpl implements RMContext {
|
|
|
clientToAMTokenSecretManager, null);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * RM service contexts which runs through out JVM life span. These are created
|
|
|
+ * once during start of RM.
|
|
|
+ * @return serviceContext of RM
|
|
|
+ */
|
|
|
+ @Private
|
|
|
+ @Unstable
|
|
|
+ public RMServiceContext getServiceContext() {
|
|
|
+ return serviceContext;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * <b>Note:</b> setting service context clears all services embedded with it.
|
|
|
+ * @param context rm service context
|
|
|
+ */
|
|
|
+ @Private
|
|
|
+ @Unstable
|
|
|
+ public void setServiceContext(RMServiceContext context) {
|
|
|
+ this.serviceContext = context;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
- public Dispatcher getDispatcher() {
|
|
|
- return this.rmDispatcher;
|
|
|
+ public ResourceManager getResourceManager() {
|
|
|
+ return serviceContext.getResourceManager();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setResourceManager(ResourceManager rm) {
|
|
|
+ serviceContext.setResourceManager(rm);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public EmbeddedElector getLeaderElectorService() {
|
|
|
+ return serviceContext.getLeaderElectorService();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void setLeaderElectorService(EmbeddedElector elector) {
|
|
|
- this.elector = elector;
|
|
|
+ serviceContext.setLeaderElectorService(elector);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public EmbeddedElector getLeaderElectorService() {
|
|
|
- return this.elector;
|
|
|
+ public Dispatcher getDispatcher() {
|
|
|
+ return serviceContext.getDispatcher();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setDispatcher(Dispatcher dispatcher) {
|
|
|
+ serviceContext.setDispatcher(dispatcher);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AdminService getRMAdminService() {
|
|
|
+ return serviceContext.getRMAdminService();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setRMAdminService(AdminService adminService) {
|
|
|
+ serviceContext.setRMAdminService(adminService);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isHAEnabled() {
|
|
|
+ return serviceContext.isHAEnabled();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setHAEnabled(boolean isHAEnabled) {
|
|
|
+ serviceContext.setHAEnabled(isHAEnabled);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HAServiceState getHAServiceState() {
|
|
|
+ return serviceContext.getHAServiceState();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setHAServiceState(HAServiceState serviceState) {
|
|
|
+ serviceContext.setHAServiceState(serviceState);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RMApplicationHistoryWriter getRMApplicationHistoryWriter() {
|
|
|
+ return serviceContext.getRMApplicationHistoryWriter();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setRMApplicationHistoryWriter(
|
|
|
+ RMApplicationHistoryWriter rmApplicationHistoryWriter) {
|
|
|
+ serviceContext.setRMApplicationHistoryWriter(rmApplicationHistoryWriter);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SystemMetricsPublisher getSystemMetricsPublisher() {
|
|
|
+ return serviceContext.getSystemMetricsPublisher();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setSystemMetricsPublisher(
|
|
|
+ SystemMetricsPublisher metricsPublisher) {
|
|
|
+ serviceContext.setSystemMetricsPublisher(metricsPublisher);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RMTimelineCollectorManager getRMTimelineCollectorManager() {
|
|
|
+ return serviceContext.getRMTimelineCollectorManager();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setRMTimelineCollectorManager(
|
|
|
+ RMTimelineCollectorManager timelineCollectorManager) {
|
|
|
+ serviceContext.setRMTimelineCollectorManager(timelineCollectorManager);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConfigurationProvider getConfigurationProvider() {
|
|
|
+ return serviceContext.getConfigurationProvider();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setConfigurationProvider(
|
|
|
+ ConfigurationProvider configurationProvider) {
|
|
|
+ serviceContext.setConfigurationProvider(configurationProvider);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Configuration getYarnConfiguration() {
|
|
|
+ return serviceContext.getYarnConfiguration();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setYarnConfiguration(Configuration yarnConfiguration) {
|
|
|
+ serviceContext.setYarnConfiguration(yarnConfiguration);
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getHAZookeeperConnectionState() {
|
|
|
+ return serviceContext.getHAZookeeperConnectionState();
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==========================================================================
|
|
|
+ /**
|
|
|
+ * RM Active service context. This will be recreated for every transition from
|
|
|
+ * ACTIVE to STANDBY.
|
|
|
+ * @return activeServiceContext of active services
|
|
|
+ */
|
|
|
+ @Private
|
|
|
+ @Unstable
|
|
|
+ public RMActiveServiceContext getActiveServiceContext() {
|
|
|
+ return activeServiceContext;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Private
|
|
|
+ @Unstable
|
|
|
+ void setActiveServiceContext(RMActiveServiceContext activeServiceContext) {
|
|
|
+ this.activeServiceContext = activeServiceContext;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -228,11 +364,6 @@ public class RMContextImpl implements RMContext {
|
|
|
return activeServiceContext.getClientToAMTokenSecretManager();
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public AdminService getRMAdminService() {
|
|
|
- return this.adminService;
|
|
|
- }
|
|
|
-
|
|
|
@VisibleForTesting
|
|
|
public void setStateStore(RMStateStore store) {
|
|
|
activeServiceContext.setStateStore(store);
|
|
@@ -253,24 +384,6 @@ public class RMContextImpl implements RMContext {
|
|
|
return activeServiceContext.getResourceTrackerService();
|
|
|
}
|
|
|
|
|
|
- void setHAEnabled(boolean isHAEnabled) {
|
|
|
- this.isHAEnabled = isHAEnabled;
|
|
|
- }
|
|
|
-
|
|
|
- void setHAServiceState(HAServiceState serviceState) {
|
|
|
- synchronized (haServiceStateLock) {
|
|
|
- this.haServiceState = serviceState;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void setDispatcher(Dispatcher dispatcher) {
|
|
|
- this.rmDispatcher = dispatcher;
|
|
|
- }
|
|
|
-
|
|
|
- void setRMAdminService(AdminService adminService) {
|
|
|
- this.adminService = adminService;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public void setClientRMService(ClientRMService clientRMService) {
|
|
|
activeServiceContext.setClientRMService(clientRMService);
|
|
@@ -348,18 +461,6 @@ public class RMContextImpl implements RMContext {
|
|
|
activeServiceContext.setResourceTrackerService(resourceTrackerService);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public boolean isHAEnabled() {
|
|
|
- return isHAEnabled;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public HAServiceState getHAServiceState() {
|
|
|
- synchronized (haServiceStateLock) {
|
|
|
- return haServiceState;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
public void setWorkPreservingRecoveryEnabled(boolean enabled) {
|
|
|
activeServiceContext.setWorkPreservingRecoveryEnabled(enabled);
|
|
|
}
|
|
@@ -369,50 +470,6 @@ public class RMContextImpl implements RMContext {
|
|
|
return activeServiceContext.isWorkPreservingRecoveryEnabled();
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public RMApplicationHistoryWriter getRMApplicationHistoryWriter() {
|
|
|
- return this.rmApplicationHistoryWriter;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void setRMTimelineCollectorManager(
|
|
|
- RMTimelineCollectorManager timelineCollectorManager) {
|
|
|
- activeServiceContext.setRMTimelineCollectorManager(
|
|
|
- timelineCollectorManager);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public RMTimelineCollectorManager getRMTimelineCollectorManager() {
|
|
|
- return activeServiceContext.getRMTimelineCollectorManager();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void setSystemMetricsPublisher(
|
|
|
- SystemMetricsPublisher metricsPublisher) {
|
|
|
- this.systemMetricsPublisher = metricsPublisher;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public SystemMetricsPublisher getSystemMetricsPublisher() {
|
|
|
- return this.systemMetricsPublisher;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void setRMApplicationHistoryWriter(
|
|
|
- RMApplicationHistoryWriter rmApplicationHistoryWriter) {
|
|
|
- this.rmApplicationHistoryWriter = rmApplicationHistoryWriter;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ConfigurationProvider getConfigurationProvider() {
|
|
|
- return this.configurationProvider;
|
|
|
- }
|
|
|
-
|
|
|
- public void setConfigurationProvider(
|
|
|
- ConfigurationProvider configurationProvider) {
|
|
|
- this.configurationProvider = configurationProvider;
|
|
|
- }
|
|
|
|
|
|
@Override
|
|
|
public long getEpoch() {
|
|
@@ -463,27 +520,6 @@ public class RMContextImpl implements RMContext {
|
|
|
return activeServiceContext.getSystemCredentialsForApps();
|
|
|
}
|
|
|
|
|
|
- @Private
|
|
|
- @Unstable
|
|
|
- public RMActiveServiceContext getActiveServiceContext() {
|
|
|
- return activeServiceContext;
|
|
|
- }
|
|
|
-
|
|
|
- @Private
|
|
|
- @Unstable
|
|
|
- void setActiveServiceContext(RMActiveServiceContext activeServiceContext) {
|
|
|
- this.activeServiceContext = activeServiceContext;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Configuration getYarnConfiguration() {
|
|
|
- return this.yarnConfiguration;
|
|
|
- }
|
|
|
-
|
|
|
- public void setYarnConfiguration(Configuration yarnConfiguration) {
|
|
|
- this.yarnConfiguration=yarnConfiguration;
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public PlacementManager getQueuePlacementManager() {
|
|
|
return this.activeServiceContext.getQueuePlacementManager();
|
|
@@ -496,12 +532,12 @@ public class RMContextImpl implements RMContext {
|
|
|
|
|
|
@Override
|
|
|
public QueueLimitCalculator getNodeManagerQueueLimitCalculator() {
|
|
|
- return this.queueLimitCalculator;
|
|
|
+ return activeServiceContext.getNodeManagerQueueLimitCalculator();
|
|
|
}
|
|
|
|
|
|
public void setContainerQueueLimitCalculator(
|
|
|
QueueLimitCalculator limitCalculator) {
|
|
|
- this.queueLimitCalculator = limitCalculator;
|
|
|
+ activeServiceContext.setContainerQueueLimitCalculator(limitCalculator);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -515,21 +551,5 @@ public class RMContextImpl implements RMContext {
|
|
|
return this.activeServiceContext.getRMAppLifetimeMonitor();
|
|
|
}
|
|
|
|
|
|
- public String getHAZookeeperConnectionState() {
|
|
|
- if (elector == null) {
|
|
|
- return "Could not find leader elector. Verify both HA and automatic " +
|
|
|
- "failover are enabled.";
|
|
|
- } else {
|
|
|
- return elector.getZookeeperConnectionState();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ResourceManager getResourceManager() {
|
|
|
- return resourceManager;
|
|
|
- }
|
|
|
-
|
|
|
- public void setResourceManager(ResourceManager rm) {
|
|
|
- this.resourceManager = rm;
|
|
|
- }
|
|
|
+ // Note: Read java doc before adding any services over here.
|
|
|
}
|