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