|
@@ -27,6 +27,8 @@ import java.util.HashMap;
|
|
|
import java.util.Collections;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
@@ -58,6 +60,20 @@ import org.apache.hadoop.yarn.api.records.ApplicationTimeout;
|
|
|
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ActiveUsersManager;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivitiesManager;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivitiesLogger;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityDiagnosticConstant;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityState;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityLevel;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.TestUtils;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.NodeIDsInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LabelsToNodesInfo;
|
|
@@ -78,13 +94,22 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppTimeoutInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppTimeoutsInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppPriority;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppQueue;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.StatisticsItemInfo;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ApplicationStatisticsInfo;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppActivitiesInfo;
|
|
|
+import org.apache.hadoop.yarn.server.scheduler.SchedulerRequestKey;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.ContainersInfo;
|
|
|
+import org.apache.hadoop.yarn.util.SystemClock;
|
|
|
+import org.apache.hadoop.yarn.util.resource.Resources;
|
|
|
import org.apache.hadoop.yarn.webapp.NotFoundException;
|
|
|
+import org.mockito.Mockito;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
+
|
|
|
/**
|
|
|
* This class mocks the RESTRequestInterceptor.
|
|
|
*/
|
|
@@ -132,8 +157,9 @@ public class MockDefaultRequestInterceptorREST
|
|
|
// Initialize appReport
|
|
|
ApplicationReport appReport = ApplicationReport.newInstance(
|
|
|
appId, ApplicationAttemptId.newInstance(appId, 1), null, newApp.getQueue(), null, null, 0,
|
|
|
- null, YarnApplicationState.ACCEPTED, "", null, 0, 0, null, null, null, 0, null, null, null,
|
|
|
- false, Priority.newInstance(newApp.getPriority()), null, null);
|
|
|
+ null, YarnApplicationState.ACCEPTED, "", null, 0, 0, null, null, null, 0,
|
|
|
+ newApp.getApplicationType(), null, null, false, Priority.newInstance(newApp.getPriority()),
|
|
|
+ null, null);
|
|
|
|
|
|
// Initialize appTimeoutsMap
|
|
|
HashMap<ApplicationTimeoutType, ApplicationTimeout> appTimeoutsMap = new HashMap<>();
|
|
@@ -661,4 +687,105 @@ public class MockDefaultRequestInterceptorREST
|
|
|
AppQueue targetAppQueue = new AppQueue(targetQueue.getQueue());
|
|
|
return Response.status(Status.OK).entity(targetAppQueue).build();
|
|
|
}
|
|
|
+
|
|
|
+ public void updateApplicationState(YarnApplicationState appState, String appId)
|
|
|
+ throws AuthorizationException, YarnException, InterruptedException, IOException {
|
|
|
+ validateRunning();
|
|
|
+ ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
+ throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+ ApplicationReport appReport = applicationMap.get(applicationId);
|
|
|
+ appReport.setYarnApplicationState(appState);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ApplicationStatisticsInfo getAppStatistics(
|
|
|
+ HttpServletRequest hsr, Set<String> stateQueries, Set<String> typeQueries) {
|
|
|
+ if (!isRunning) {
|
|
|
+ throw new RuntimeException("RM is stopped");
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, StatisticsItemInfo> itemInfoMap = new HashMap<>();
|
|
|
+
|
|
|
+ for (ApplicationReport appReport : applicationMap.values()) {
|
|
|
+
|
|
|
+ YarnApplicationState appState = appReport.getYarnApplicationState();
|
|
|
+ String appType = appReport.getApplicationType();
|
|
|
+
|
|
|
+ if (stateQueries.contains(appState.name()) && typeQueries.contains(appType)) {
|
|
|
+ String itemInfoMapKey = appState.toString() + "_" + appType;
|
|
|
+ StatisticsItemInfo itemInfo = itemInfoMap.getOrDefault(itemInfoMapKey, null);
|
|
|
+ if (itemInfo == null) {
|
|
|
+ itemInfo = new StatisticsItemInfo(appState, appType, 1);
|
|
|
+ } else {
|
|
|
+ long newCount = itemInfo.getCount() + 1;
|
|
|
+ itemInfo.setCount(newCount);
|
|
|
+ }
|
|
|
+ itemInfoMap.put(itemInfoMapKey, itemInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new ApplicationStatisticsInfo(itemInfoMap.values());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AppActivitiesInfo getAppActivities(
|
|
|
+ HttpServletRequest hsr, String appId, String time, Set<String> requestPriorities,
|
|
|
+ Set<String> allocationRequestIds, String groupBy, String limit, Set<String> actions,
|
|
|
+ boolean summarize) {
|
|
|
+ if (!isRunning) {
|
|
|
+ throw new RuntimeException("RM is stopped");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
+ throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ SchedulerNode schedulerNode = TestUtils.getMockNode("host0", "rack", 1, 10240);
|
|
|
+
|
|
|
+ RMContext rmContext = Mockito.mock(RMContext.class);
|
|
|
+ Mockito.when(rmContext.getYarnConfiguration()).thenReturn(this.getConf());
|
|
|
+ ResourceScheduler scheduler = Mockito.mock(ResourceScheduler.class);
|
|
|
+ Mockito.when(scheduler.getMinimumResourceCapability()).thenReturn(Resources.none());
|
|
|
+ Mockito.when(rmContext.getScheduler()).thenReturn(scheduler);
|
|
|
+ LeafQueue mockQueue = Mockito.mock(LeafQueue.class);
|
|
|
+ Map<ApplicationId, RMApp> rmApps = new ConcurrentHashMap<>();
|
|
|
+ Mockito.doReturn(rmApps).when(rmContext).getRMApps();
|
|
|
+
|
|
|
+ FiCaSchedulerNode node = (FiCaSchedulerNode) schedulerNode;
|
|
|
+ ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(applicationId, 0);
|
|
|
+ RMApp mockApp = Mockito.mock(RMApp.class);
|
|
|
+ Mockito.doReturn(appAttemptId.getApplicationId()).when(mockApp).getApplicationId();
|
|
|
+ Mockito.doReturn(FinalApplicationStatus.UNDEFINED).when(mockApp).getFinalApplicationStatus();
|
|
|
+ rmApps.put(appAttemptId.getApplicationId(), mockApp);
|
|
|
+ FiCaSchedulerApp app = new FiCaSchedulerApp(appAttemptId, "user", mockQueue,
|
|
|
+ mock(ActiveUsersManager.class), rmContext);
|
|
|
+
|
|
|
+ ActivitiesManager newActivitiesManager = new ActivitiesManager(rmContext);
|
|
|
+ newActivitiesManager.turnOnAppActivitiesRecording(app.getApplicationId(), 3);
|
|
|
+
|
|
|
+ int numActivities = 10;
|
|
|
+ for (int i = 0; i < numActivities; i++) {
|
|
|
+ ActivitiesLogger.APP.startAppAllocationRecording(newActivitiesManager, node,
|
|
|
+ SystemClock.getInstance().getTime(), app);
|
|
|
+ ActivitiesLogger.APP.recordAppActivityWithoutAllocation(newActivitiesManager, node, app,
|
|
|
+ new SchedulerRequestKey(Priority.newInstance(0), 0, null),
|
|
|
+ ActivityDiagnosticConstant.NODE_IS_BLACKLISTED, ActivityState.REJECTED,
|
|
|
+ ActivityLevel.NODE);
|
|
|
+ ActivitiesLogger.APP.finishSkippedAppAllocationRecording(newActivitiesManager,
|
|
|
+ app.getApplicationId(), ActivityState.SKIPPED, ActivityDiagnosticConstant.EMPTY);
|
|
|
+ }
|
|
|
+
|
|
|
+ Set<Integer> prioritiesInt =
|
|
|
+ requestPriorities.stream().map(pri -> Integer.parseInt(pri)).collect(Collectors.toSet());
|
|
|
+ Set<Long> allocationReqIds =
|
|
|
+ allocationRequestIds.stream().map(id -> Long.parseLong(id)).collect(Collectors.toSet());
|
|
|
+ AppActivitiesInfo appActivitiesInfo = newActivitiesManager.
|
|
|
+ getAppActivitiesInfo(app.getApplicationId(), prioritiesInt, allocationReqIds, null,
|
|
|
+ Integer.parseInt(limit), summarize, 3);
|
|
|
+
|
|
|
+ return appActivitiesInfo;
|
|
|
+ }
|
|
|
}
|