diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/TestRMContainerAllocator.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/TestRMContainerAllocator.java index 3a6644e..c322f23 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/TestRMContainerAllocator.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/TestRMContainerAllocator.java @@ -95,6 +95,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockNM; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; +import org.apache.hadoop.yarn.server.resourcemanager.RMSchedulerService; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Allocation; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; @@ -467,17 +468,22 @@ protected Dispatcher createDispatcher() { return new EventHandler() { @Override public void handle(SchedulerEvent event) { - scheduler.handle(event); + getRMContext().getScheduler().handle(event); } }; } @Override - protected ResourceScheduler createScheduler() { - return new MyFifoScheduler(this.getRMContext()); + protected RMSchedulerService createRMSchedulerService() { + return new RMSchedulerService(getConfig(), rmContext) { + @Override + protected ResourceScheduler createScheduler(Configuration conf) { + return new MyFifoScheduler(rmContext); + } + }; } MyFifoScheduler getMyFifoScheduler() { - return (MyFifoScheduler) scheduler; + return (MyFifoScheduler) getRMContext().getScheduler(); } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMSchedulerService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMSchedulerService.java new file mode 100644 index 0000000..42a8c8d --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMSchedulerService.java @@ -0,0 +1,91 @@ +/** +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package org.apache.hadoop.yarn.server.resourcemanager; + +import com.google.common.annotations.VisibleForTesting; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.service.AbstractService; +import org.apache.hadoop.util.ReflectionUtils; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; + +import java.io.IOException; + +public class RMSchedulerService extends AbstractService { + private static final Log LOG = LogFactory.getLog(RMSchedulerService.class); + + protected ResourceScheduler scheduler; + RMContextImpl rmContext; + + /** + * Construct the service. + * + */ + public RMSchedulerService(Configuration conf, RMContextImpl rmContext) { + super(RMSecretManagerService.class.getName()); + this.rmContext = rmContext; + + scheduler = createScheduler(conf); + rmContext.setScheduler(scheduler); + } + + @Override + public void serviceInit(Configuration conf) throws Exception { + try { + scheduler.reinitialize(conf, rmContext); + } catch (IOException ioe) { + throw new RuntimeException("Failed to initialize scheduler", ioe); + } + + super.serviceInit(conf); + } + + @Override + public void serviceStart() throws Exception { + super.serviceStart(); + } + + @Override + public void serviceStop() throws Exception { + super.serviceStop(); + } + + @VisibleForTesting + protected ResourceScheduler createScheduler(Configuration conf) { + String schedulerClassName = conf.get(YarnConfiguration.RM_SCHEDULER, + YarnConfiguration.DEFAULT_RM_SCHEDULER); + LOG.info("Using Scheduler: " + schedulerClassName); + try { + Class schedulerClazz = Class.forName(schedulerClassName); + if (ResourceScheduler.class.isAssignableFrom(schedulerClazz)) { + return (ResourceScheduler) ReflectionUtils.newInstance(schedulerClazz, + conf); + } else { + throw new YarnRuntimeException("Class: " + schedulerClassName + + " not instance of " + ResourceScheduler.class.getCanonicalName()); + } + } catch (ClassNotFoundException e) { + throw new YarnRuntimeException("Could not instantiate Scheduler: " + + schedulerClassName, e); + } + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index d7f51e9..7858b82 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -136,11 +136,11 @@ protected RMSecretManagerService rmSecretManagerService; private Dispatcher rmDispatcher; - protected ResourceScheduler scheduler; private ClientRMService clientRM; protected ApplicationMasterService masterService; private ApplicationMasterLauncher applicationMasterLauncher; private ContainerAllocationExpirer containerAllocationExpirer; + protected RMSchedulerService schedulerService; protected NMLivelinessMonitor nmLivelinessMonitor; protected NodesListManager nodesListManager; private EventHandler schedulerDispatcher; @@ -204,7 +204,7 @@ protected void setRMStateStore(RMStateStore rmStore) { } protected EventHandler createSchedulerEventDispatcher() { - return new SchedulerEventDispatcher(this.scheduler); + return new SchedulerEventDispatcher(rmContext.getScheduler()); } protected RMStateStoreOperationFailedEventDispatcher @@ -216,24 +216,6 @@ protected Dispatcher createDispatcher() { return new AsyncDispatcher(); } - protected ResourceScheduler createScheduler() { - String schedulerClassName = conf.get(YarnConfiguration.RM_SCHEDULER, - YarnConfiguration.DEFAULT_RM_SCHEDULER); - LOG.info("Using Scheduler: " + schedulerClassName); - try { - Class schedulerClazz = Class.forName(schedulerClassName); - if (ResourceScheduler.class.isAssignableFrom(schedulerClazz)) { - return (ResourceScheduler) ReflectionUtils.newInstance(schedulerClazz, - this.conf); - } else { - throw new YarnRuntimeException("Class: " + schedulerClassName - + " not instance of " + ResourceScheduler.class.getCanonicalName()); - } - } catch (ClassNotFoundException e) { - throw new YarnRuntimeException("Could not instantiate Scheduler: " - + schedulerClassName, e); - } - } protected ApplicationMasterLauncher createAMLauncher() { return new ApplicationMasterLauncher(this.rmContext); @@ -253,7 +235,7 @@ protected DelegationTokenRenewer createDelegationTokenRenewer() { } protected RMAppManager createRMAppManager() { - return new RMAppManager(this.rmContext, this.scheduler, this.masterService, + return new RMAppManager(this.rmContext, rmContext.getScheduler(), this.masterService, this.applicationACLsManager, this.conf); } @@ -354,8 +336,8 @@ protected void serviceInit(Configuration configuration) throws Exception { rmContext.setNodesListManager(nodesListManager); // Initialize the scheduler - scheduler = createScheduler(); - rmContext.setScheduler(scheduler); + schedulerService = createRMSchedulerService(); + addService(schedulerService); schedulerDispatcher = createSchedulerEventDispatcher(); addIfService(schedulerDispatcher); @@ -383,12 +365,6 @@ protected void serviceInit(Configuration configuration) throws Exception { DefaultMetricsSystem.initialize("ResourceManager"); JvmMetrics.initSingleton("ResourceManager", null); - try { - scheduler.reinitialize(conf, rmContext); - } catch (IOException ioe) { - throw new RuntimeException("Failed to initialize scheduler", ioe); - } - // creating monitors that handle preemption createPolicyMonitors(); @@ -398,7 +374,7 @@ protected void serviceInit(Configuration configuration) throws Exception { applicationACLsManager = new ApplicationACLsManager(conf); - queueACLsManager = createQueueACLsManager(scheduler, conf); + queueACLsManager = createQueueACLsManager(rmContext.getScheduler(), conf); rmAppManager = createRMAppManager(); // Register event handler for RMAppManagerEvents @@ -419,7 +395,7 @@ protected void serviceInit(Configuration configuration) throws Exception { delegationTokenRenewer.setRMContext(rmContext); } - new RMNMInfo(rmContext, scheduler); + new RMNMInfo(rmContext, rmContext.getScheduler()); super.serviceInit(conf); } @@ -475,6 +451,7 @@ protected void serviceStop() throws Exception { } protected void createPolicyMonitors() { + ResourceScheduler scheduler = rmContext.getScheduler(); if (scheduler instanceof PreemptableResourceScheduler && conf.getBoolean(YarnConfiguration.RM_SCHEDULER_ENABLE_MONITORS, YarnConfiguration.DEFAULT_RM_SCHEDULER_ENABLE_MONITORS)) { @@ -889,13 +866,14 @@ protected ResourceTrackerService createResourceTrackerService() { } protected ClientRMService createClientRMService() { - return new ClientRMService(this.rmContext, scheduler, this.rmAppManager, + return new ClientRMService(this.rmContext, + this.rmContext.getScheduler(), this.rmAppManager, this.applicationACLsManager, this.queueACLsManager, getRMDTSecretManager()); } protected ApplicationMasterService createApplicationMasterService() { - return new ApplicationMasterService(this.rmContext, scheduler); + return new ApplicationMasterService(this.rmContext, this.rmContext.getScheduler()); } protected AdminService createAdminService() { @@ -906,6 +884,10 @@ protected RMSecretManagerService createRMSecretManagerService() { return new RMSecretManagerService(conf, rmContext); } + protected RMSchedulerService createRMSchedulerService() { + return new RMSchedulerService(conf, rmContext); + } + @Private public ClientRMService getClientRMService() { return this.clientRM; @@ -917,7 +899,7 @@ public ClientRMService getClientRMService() { */ @Private public ResourceScheduler getResourceScheduler() { - return this.scheduler; + return getRMContext().getScheduler(); } /** diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java index 76d8b1a..71f1771 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java @@ -351,7 +351,7 @@ protected void serviceStop() { @Override protected ApplicationMasterService createApplicationMasterService() { - return new ApplicationMasterService(getRMContext(), scheduler) { + return new ApplicationMasterService(getRMContext(), getRMContext().getScheduler()) { @Override protected void serviceStart() { // override to not start rpc handler diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/QueueACLsTestBase.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/QueueACLsTestBase.java index b400e4f..61b95f7 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/QueueACLsTestBase.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/QueueACLsTestBase.java @@ -84,7 +84,7 @@ public void setup() throws InterruptedException, IOException { resourceManager = new MockRM(conf) { protected ClientRMService createClientRMService() { - return new ClientRMService(getRMContext(), this.scheduler, + return new ClientRMService(getRMContext(), getRMContext().getScheduler(), this.rmAppManager, this.applicationACLsManager, this.queueACLsManager, getRMDTSecretManager()); }; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java index a9f1c1a..ce2d7a9 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java @@ -144,7 +144,7 @@ protected void doSecureLogin() throws IOException { @Override protected ApplicationMasterService createApplicationMasterService() { - return new ApplicationMasterService(getRMContext(), this.scheduler); + return new ApplicationMasterService(getRMContext(), getRMContext().getScheduler()); } @SuppressWarnings("unchecked") diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationACLs.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationACLs.java index e31aaa8..bcb9463 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationACLs.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationACLs.java @@ -119,7 +119,7 @@ public Object answer(InvocationOnMock invocation) { } protected ClientRMService createClientRMService() { - return new ClientRMService(getRMContext(), this.scheduler, + return new ClientRMService(getRMContext(), getRMContext().getScheduler(), this.rmAppManager, this.applicationACLsManager, this.queueACLsManager, null); }; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java index 5eecae0..c79b549 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java @@ -133,10 +133,10 @@ public void testContainerCleanup() throws Exception { MockRM rm = new MockRM() { @Override protected EventHandler createSchedulerEventDispatcher() { - return new SchedulerEventDispatcher(this.scheduler) { + return new SchedulerEventDispatcher(getRMContext().getScheduler()) { @Override public void handle(SchedulerEvent event) { - scheduler.handle(event); + getRMContext().getScheduler().handle(event); } }; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java index d425dda..69fbb1d 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java @@ -131,7 +131,7 @@ public static void teardownSecretManager() { public void testGetClusterNodes() throws Exception { MockRM rm = new MockRM() { protected ClientRMService createClientRMService() { - return new ClientRMService(this.rmContext, scheduler, + return new ClientRMService(this.rmContext, getRMContext().getScheduler(), this.rmAppManager, this.applicationACLsManager, this.queueACLsManager, this.getRMDTSecretManager()); }; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java index abb21ed..9212dca 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java @@ -465,10 +465,10 @@ public void testReconnectNode() throws Exception { MockRM rm = new MockRM() { @Override protected EventHandler createSchedulerEventDispatcher() { - return new SchedulerEventDispatcher(this.scheduler) { + return new SchedulerEventDispatcher(getRMContext().getScheduler()) { @Override public void handle(SchedulerEvent event) { - scheduler.handle(event); + getRMContext().getScheduler().handle(event); } }; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java index 1b2a14b..c118ce7 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java @@ -56,10 +56,10 @@ public void setUp() { this.rm = new MockRM() { @Override protected EventHandler createSchedulerEventDispatcher() { - return new SchedulerEventDispatcher(this.scheduler) { + return new SchedulerEventDispatcher(getResourceScheduler()) { @Override public void handle(SchedulerEvent event) { - scheduler.handle(event); + getResourceScheduler().handle(event); } }; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java index 6a209e7..33d6d70 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java @@ -166,7 +166,7 @@ public void testClientToAMTokens() throws Exception { MockRM rm = new MockRMWithCustomAMLauncher(conf, containerManager) { protected ClientRMService createClientRMService() { - return new ClientRMService(this.rmContext, scheduler, + return new ClientRMService(this.rmContext, getRMContext().getScheduler(), this.rmAppManager, this.applicationACLsManager, this.queueACLsManager, getRMDTSecretManager()); };