1 /** 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package org.apache.hadoop.yarn.server.resourcemanager; 20 21 import java.nio.ByteBuffer; 22 import java.util.concurrent.ConcurrentHashMap; 23 import java.util.concurrent.ConcurrentMap; 24 25 import org.apache.commons.logging.Log; 26 import org.apache.commons.logging.LogFactory; 27 import org.apache.hadoop.classification.InterfaceAudience.Private; 28 import org.apache.hadoop.classification.InterfaceStability.Unstable; 29 import org.apache.hadoop.yarn.api.records.ApplicationId; 30 import org.apache.hadoop.yarn.api.records.NodeId; 31 import org.apache.hadoop.yarn.conf.YarnConfiguration; 32 import org.apache.hadoop.yarn.event.Dispatcher; 33 import org.apache.hadoop.yarn.server.resourcemanager.ahs.RMApplicationHistoryWriter; 34 import org.apache.hadoop.yarn.server.resourcemanager.metrics.SystemMetricsPublisher; 35 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; 36 import org.apache.hadoop.yarn.server.resourcemanager.recovery.NullRMStateStore; 37 import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore; 38 import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSystem; 39 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; 40 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AMLivelinessMonitor; 41 import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.ContainerAllocationExpirer; 42 import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; 43 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; 44 import org.apache.hadoop.yarn.server.resourcemanager.security.AMRMTokenSecretManager; 45 import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSecretManagerInRM; 46 import org.apache.hadoop.yarn.server.resourcemanager.security.DelegationTokenRenewer; 47 import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM; 48 import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager; 49 import org.apache.hadoop.yarn.server.resourcemanager.security.RMDelegationTokenSecretManager; 50 import org.apache.hadoop.yarn.util.Clock; 51 import org.apache.hadoop.yarn.util.SystemClock; 52 53 /** 54 * The RMActiveServiceContext is the class that maintains all the 55 * RMActiveService contexts.This is expected to be used only by ResourceManager 56 * and RMContext. 57 */ 58 @Private 59 @Unstable 60 public class RMActiveServiceContext { 61 62 private static final Log LOG = LogFactory 63 .getLog(RMActiveServiceContext.class); 64 65 private final ConcurrentMap<ApplicationId, RMApp> applications = 66 new ConcurrentHashMap<ApplicationId, RMApp>(); 67 68 private final ConcurrentMap<NodeId, RMNode> nodes = 69 new ConcurrentHashMap<NodeId, RMNode>(); 70 71 private final ConcurrentMap<String, RMNode> inactiveNodes = 72 new ConcurrentHashMap<String, RMNode>(); 73 74 private final ConcurrentMap<ApplicationId, ByteBuffer> systemCredentials = 75 new ConcurrentHashMap<ApplicationId, ByteBuffer>(); 76 77 private boolean isWorkPreservingRecoveryEnabled; 78 79 private AMLivelinessMonitor amLivelinessMonitor; 80 private AMLivelinessMonitor amFinishingMonitor; 81 private RMStateStore stateStore = null; 82 private ContainerAllocationExpirer containerAllocationExpirer; 83 private DelegationTokenRenewer delegationTokenRenewer; 84 private AMRMTokenSecretManager amRMTokenSecretManager; 85 private RMContainerTokenSecretManager containerTokenSecretManager; 86 private NMTokenSecretManagerInRM nmTokenSecretManager; 87 private ClientToAMTokenSecretManagerInRM clientToAMTokenSecretManager; 88 private ClientRMService clientRMService; 89 private RMDelegationTokenSecretManager rmDelegationTokenSecretManager; 90 private ResourceScheduler scheduler; 91 private ReservationSystem reservationSystem; 92 private NodesListManager nodesListManager; 93 private ResourceTrackerService resourceTrackerService; 94 private ApplicationMasterService applicationMasterService; 95 private RMNodeLabelsManager nodeLabelManager; 96 private long epoch; 97 private Clock systemClock = new SystemClock(); 98 private long schedulerRecoveryStartTime = 0; 99 private long schedulerRecoveryWaitTime = 0; 100 private boolean printLog = true; 101 private boolean isSchedulerReady = false; 102 RMActiveServiceContext()103 public RMActiveServiceContext() { 104 105 } 106 107 @Private 108 @Unstable RMActiveServiceContext(Dispatcher rmDispatcher, ContainerAllocationExpirer containerAllocationExpirer, AMLivelinessMonitor amLivelinessMonitor, AMLivelinessMonitor amFinishingMonitor, DelegationTokenRenewer delegationTokenRenewer, AMRMTokenSecretManager appTokenSecretManager, RMContainerTokenSecretManager containerTokenSecretManager, NMTokenSecretManagerInRM nmTokenSecretManager, ClientToAMTokenSecretManagerInRM clientToAMTokenSecretManager, ResourceScheduler scheduler)109 public RMActiveServiceContext(Dispatcher rmDispatcher, 110 ContainerAllocationExpirer containerAllocationExpirer, 111 AMLivelinessMonitor amLivelinessMonitor, 112 AMLivelinessMonitor amFinishingMonitor, 113 DelegationTokenRenewer delegationTokenRenewer, 114 AMRMTokenSecretManager appTokenSecretManager, 115 RMContainerTokenSecretManager containerTokenSecretManager, 116 NMTokenSecretManagerInRM nmTokenSecretManager, 117 ClientToAMTokenSecretManagerInRM clientToAMTokenSecretManager, 118 ResourceScheduler scheduler) { 119 this(); 120 this.setContainerAllocationExpirer(containerAllocationExpirer); 121 this.setAMLivelinessMonitor(amLivelinessMonitor); 122 this.setAMFinishingMonitor(amFinishingMonitor); 123 this.setDelegationTokenRenewer(delegationTokenRenewer); 124 this.setAMRMTokenSecretManager(appTokenSecretManager); 125 this.setContainerTokenSecretManager(containerTokenSecretManager); 126 this.setNMTokenSecretManager(nmTokenSecretManager); 127 this.setClientToAMTokenSecretManager(clientToAMTokenSecretManager); 128 this.setScheduler(scheduler); 129 130 RMStateStore nullStore = new NullRMStateStore(); 131 nullStore.setRMDispatcher(rmDispatcher); 132 try { 133 nullStore.init(new YarnConfiguration()); 134 setStateStore(nullStore); 135 } catch (Exception e) { 136 assert false; 137 } 138 } 139 140 @Private 141 @Unstable setStateStore(RMStateStore store)142 public void setStateStore(RMStateStore store) { 143 stateStore = store; 144 } 145 146 @Private 147 @Unstable getClientRMService()148 public ClientRMService getClientRMService() { 149 return clientRMService; 150 } 151 152 @Private 153 @Unstable getApplicationMasterService()154 public ApplicationMasterService getApplicationMasterService() { 155 return applicationMasterService; 156 } 157 158 @Private 159 @Unstable getResourceTrackerService()160 public ResourceTrackerService getResourceTrackerService() { 161 return resourceTrackerService; 162 } 163 164 @Private 165 @Unstable getStateStore()166 public RMStateStore getStateStore() { 167 return stateStore; 168 } 169 170 @Private 171 @Unstable getRMApps()172 public ConcurrentMap<ApplicationId, RMApp> getRMApps() { 173 return this.applications; 174 } 175 176 @Private 177 @Unstable getRMNodes()178 public ConcurrentMap<NodeId, RMNode> getRMNodes() { 179 return this.nodes; 180 } 181 182 @Private 183 @Unstable getInactiveRMNodes()184 public ConcurrentMap<String, RMNode> getInactiveRMNodes() { 185 return this.inactiveNodes; 186 } 187 188 @Private 189 @Unstable getContainerAllocationExpirer()190 public ContainerAllocationExpirer getContainerAllocationExpirer() { 191 return this.containerAllocationExpirer; 192 } 193 194 @Private 195 @Unstable getAMLivelinessMonitor()196 public AMLivelinessMonitor getAMLivelinessMonitor() { 197 return this.amLivelinessMonitor; 198 } 199 200 @Private 201 @Unstable getAMFinishingMonitor()202 public AMLivelinessMonitor getAMFinishingMonitor() { 203 return this.amFinishingMonitor; 204 } 205 206 @Private 207 @Unstable getDelegationTokenRenewer()208 public DelegationTokenRenewer getDelegationTokenRenewer() { 209 return delegationTokenRenewer; 210 } 211 212 @Private 213 @Unstable getAMRMTokenSecretManager()214 public AMRMTokenSecretManager getAMRMTokenSecretManager() { 215 return this.amRMTokenSecretManager; 216 } 217 218 @Private 219 @Unstable getContainerTokenSecretManager()220 public RMContainerTokenSecretManager getContainerTokenSecretManager() { 221 return this.containerTokenSecretManager; 222 } 223 224 @Private 225 @Unstable getNMTokenSecretManager()226 public NMTokenSecretManagerInRM getNMTokenSecretManager() { 227 return this.nmTokenSecretManager; 228 } 229 230 @Private 231 @Unstable getScheduler()232 public ResourceScheduler getScheduler() { 233 return this.scheduler; 234 } 235 236 @Private 237 @Unstable getReservationSystem()238 public ReservationSystem getReservationSystem() { 239 return this.reservationSystem; 240 } 241 242 @Private 243 @Unstable getNodesListManager()244 public NodesListManager getNodesListManager() { 245 return this.nodesListManager; 246 } 247 248 @Private 249 @Unstable getClientToAMTokenSecretManager()250 public ClientToAMTokenSecretManagerInRM getClientToAMTokenSecretManager() { 251 return this.clientToAMTokenSecretManager; 252 } 253 254 @Private 255 @Unstable setClientRMService(ClientRMService clientRMService)256 public void setClientRMService(ClientRMService clientRMService) { 257 this.clientRMService = clientRMService; 258 } 259 260 @Private 261 @Unstable getRMDelegationTokenSecretManager()262 public RMDelegationTokenSecretManager getRMDelegationTokenSecretManager() { 263 return this.rmDelegationTokenSecretManager; 264 } 265 266 @Private 267 @Unstable setRMDelegationTokenSecretManager( RMDelegationTokenSecretManager delegationTokenSecretManager)268 public void setRMDelegationTokenSecretManager( 269 RMDelegationTokenSecretManager delegationTokenSecretManager) { 270 this.rmDelegationTokenSecretManager = delegationTokenSecretManager; 271 } 272 273 @Private 274 @Unstable setContainerAllocationExpirer( ContainerAllocationExpirer containerAllocationExpirer)275 void setContainerAllocationExpirer( 276 ContainerAllocationExpirer containerAllocationExpirer) { 277 this.containerAllocationExpirer = containerAllocationExpirer; 278 } 279 280 @Private 281 @Unstable setAMLivelinessMonitor(AMLivelinessMonitor amLivelinessMonitor)282 void setAMLivelinessMonitor(AMLivelinessMonitor amLivelinessMonitor) { 283 this.amLivelinessMonitor = amLivelinessMonitor; 284 } 285 286 @Private 287 @Unstable setAMFinishingMonitor(AMLivelinessMonitor amFinishingMonitor)288 void setAMFinishingMonitor(AMLivelinessMonitor amFinishingMonitor) { 289 this.amFinishingMonitor = amFinishingMonitor; 290 } 291 292 @Private 293 @Unstable setContainerTokenSecretManager( RMContainerTokenSecretManager containerTokenSecretManager)294 void setContainerTokenSecretManager( 295 RMContainerTokenSecretManager containerTokenSecretManager) { 296 this.containerTokenSecretManager = containerTokenSecretManager; 297 } 298 299 @Private 300 @Unstable setNMTokenSecretManager(NMTokenSecretManagerInRM nmTokenSecretManager)301 void setNMTokenSecretManager(NMTokenSecretManagerInRM nmTokenSecretManager) { 302 this.nmTokenSecretManager = nmTokenSecretManager; 303 } 304 305 @Private 306 @Unstable setScheduler(ResourceScheduler scheduler)307 void setScheduler(ResourceScheduler scheduler) { 308 this.scheduler = scheduler; 309 } 310 311 @Private 312 @Unstable setReservationSystem(ReservationSystem reservationSystem)313 void setReservationSystem(ReservationSystem reservationSystem) { 314 this.reservationSystem = reservationSystem; 315 } 316 317 @Private 318 @Unstable setDelegationTokenRenewer(DelegationTokenRenewer delegationTokenRenewer)319 void setDelegationTokenRenewer(DelegationTokenRenewer delegationTokenRenewer) { 320 this.delegationTokenRenewer = delegationTokenRenewer; 321 } 322 323 @Private 324 @Unstable setClientToAMTokenSecretManager( ClientToAMTokenSecretManagerInRM clientToAMTokenSecretManager)325 void setClientToAMTokenSecretManager( 326 ClientToAMTokenSecretManagerInRM clientToAMTokenSecretManager) { 327 this.clientToAMTokenSecretManager = clientToAMTokenSecretManager; 328 } 329 330 @Private 331 @Unstable setAMRMTokenSecretManager(AMRMTokenSecretManager amRMTokenSecretManager)332 void setAMRMTokenSecretManager(AMRMTokenSecretManager amRMTokenSecretManager) { 333 this.amRMTokenSecretManager = amRMTokenSecretManager; 334 } 335 336 @Private 337 @Unstable setNodesListManager(NodesListManager nodesListManager)338 void setNodesListManager(NodesListManager nodesListManager) { 339 this.nodesListManager = nodesListManager; 340 } 341 342 @Private 343 @Unstable setApplicationMasterService( ApplicationMasterService applicationMasterService)344 void setApplicationMasterService( 345 ApplicationMasterService applicationMasterService) { 346 this.applicationMasterService = applicationMasterService; 347 } 348 349 @Private 350 @Unstable setResourceTrackerService(ResourceTrackerService resourceTrackerService)351 void setResourceTrackerService(ResourceTrackerService resourceTrackerService) { 352 this.resourceTrackerService = resourceTrackerService; 353 } 354 355 @Private 356 @Unstable setWorkPreservingRecoveryEnabled(boolean enabled)357 public void setWorkPreservingRecoveryEnabled(boolean enabled) { 358 this.isWorkPreservingRecoveryEnabled = enabled; 359 } 360 361 @Private 362 @Unstable isWorkPreservingRecoveryEnabled()363 public boolean isWorkPreservingRecoveryEnabled() { 364 return this.isWorkPreservingRecoveryEnabled; 365 } 366 367 @Private 368 @Unstable getEpoch()369 public long getEpoch() { 370 return this.epoch; 371 } 372 373 @Private 374 @Unstable setEpoch(long epoch)375 void setEpoch(long epoch) { 376 this.epoch = epoch; 377 } 378 379 @Private 380 @Unstable getNodeLabelManager()381 public RMNodeLabelsManager getNodeLabelManager() { 382 return nodeLabelManager; 383 } 384 385 @Private 386 @Unstable setNodeLabelManager(RMNodeLabelsManager mgr)387 public void setNodeLabelManager(RMNodeLabelsManager mgr) { 388 nodeLabelManager = mgr; 389 } 390 391 @Private 392 @Unstable setSchedulerRecoveryStartAndWaitTime(long waitTime)393 public void setSchedulerRecoveryStartAndWaitTime(long waitTime) { 394 this.schedulerRecoveryStartTime = systemClock.getTime(); 395 this.schedulerRecoveryWaitTime = waitTime; 396 } 397 398 @Private 399 @Unstable isSchedulerReadyForAllocatingContainers()400 public boolean isSchedulerReadyForAllocatingContainers() { 401 if (isSchedulerReady) { 402 return isSchedulerReady; 403 } 404 isSchedulerReady = 405 (systemClock.getTime() - schedulerRecoveryStartTime) > schedulerRecoveryWaitTime; 406 if (!isSchedulerReady && printLog) { 407 LOG.info("Skip allocating containers. Scheduler is waiting for recovery."); 408 printLog = false; 409 } 410 if (isSchedulerReady) { 411 LOG.info("Scheduler recovery is done. Start allocating new containers."); 412 } 413 return isSchedulerReady; 414 } 415 416 @Private 417 @Unstable setSystemClock(Clock clock)418 public void setSystemClock(Clock clock) { 419 this.systemClock = clock; 420 } 421 422 @Private 423 @Unstable getSystemCredentialsForApps()424 public ConcurrentMap<ApplicationId, ByteBuffer> getSystemCredentialsForApps() { 425 return systemCredentials; 426 } 427 } 428