/** * 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.webapp.dao; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationResourceUsageReport; import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.LogAggregationStatus; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler; import org.apache.hadoop.yarn.util.ConverterUtils; import org.apache.hadoop.yarn.util.Times; import org.apache.hadoop.yarn.webapp.util.WebAppUtils; import com.google.common.base.Joiner; @XmlRootElement(name = "app") @XmlAccessorType(XmlAccessType.FIELD) public class AppInfo { @XmlTransient protected String appIdNum; @XmlTransient protected boolean trackingUrlIsNotReady; @XmlTransient protected String trackingUrlPretty; @XmlTransient protected boolean amContainerLogsExist = false; @XmlTransient protected ApplicationId applicationId; @XmlTransient private String schemePrefix; // these are ok for any user to see protected String id; protected String user; protected String name; protected String queue; protected YarnApplicationState state; protected FinalApplicationStatus finalStatus; protected float progress; protected String trackingUI; protected String trackingUrl; protected String diagnostics; protected long clusterId; protected String applicationType; protected String applicationTags = ""; protected int priority; // these are only allowed if acls allow protected long startedTime; protected long finishedTime; protected long elapsedTime; protected String amContainerLogs; protected String amHostHttpAddress; protected long allocatedMB; protected long allocatedVCores; protected int runningContainers; protected long memorySeconds; protected long vcoreSeconds; protected float queueUsagePercentage; protected float clusterUsagePercentage; // preemption info fields protected long preemptedResourceMB; protected long preemptedResourceVCores; protected int numNonAMContainerPreempted; protected int numAMContainerPreempted; protected List<ResourceRequest> resourceRequests; protected LogAggregationStatus logAggregationStatus; protected boolean unmanagedApplication; protected String appNodeLabelExpression; protected String amNodeLabelExpression; public AppInfo() { } // JAXB needs this @SuppressWarnings({ "rawtypes", "unchecked" }) public AppInfo(ResourceManager rm, RMApp app, Boolean hasAccess, String schemePrefix) { this.schemePrefix = schemePrefix; if (app != null) { String trackingUrl = app.getTrackingUrl(); this.state = app.createApplicationState(); this.trackingUrlIsNotReady = trackingUrl == null || trackingUrl.isEmpty() || YarnApplicationState.NEW == this.state || YarnApplicationState.NEW_SAVING == this.state || YarnApplicationState.SUBMITTED == this.state || YarnApplicationState.ACCEPTED == this.state; this.trackingUI = this.trackingUrlIsNotReady ? "UNASSIGNED" : (app .getFinishTime() == 0 ? "ApplicationMaster" : "History"); if (!trackingUrlIsNotReady) { this.trackingUrl = WebAppUtils.getURLWithScheme(schemePrefix, trackingUrl); this.trackingUrlPretty = this.trackingUrl; } else { this.trackingUrlPretty = "UNASSIGNED"; } this.applicationId = app.getApplicationId(); this.applicationType = app.getApplicationType(); this.appIdNum = String.valueOf(app.getApplicationId().getId()); this.id = app.getApplicationId().toString(); this.user = app.getUser().toString(); this.name = app.getName().toString(); this.queue = app.getQueue().toString(); this.priority = 0; ApplicationSubmissionContext appSubmissionContext = app.getApplicationSubmissionContext(); if (appSubmissionContext.getPriority() != null) { this.priority = appSubmissionContext.getPriority() .getPriority(); } this.progress = app.getProgress() * 100; this.diagnostics = app.getDiagnostics().toString(); if (diagnostics == null || diagnostics.isEmpty()) { this.diagnostics = ""; } if (app.getApplicationTags() != null && !app.getApplicationTags().isEmpty()) { this.applicationTags = Joiner.on(',').join(app.getApplicationTags()); } this.finalStatus = app.getFinalApplicationStatus(); this.clusterId = ResourceManager.getClusterTimeStamp(); if (hasAccess) { this.startedTime = app.getStartTime(); this.finishedTime = app.getFinishTime(); this.elapsedTime = Times.elapsed(app.getStartTime(), app.getFinishTime()); this.logAggregationStatus = app.getLogAggregationStatusForAppReport(); RMAppAttempt attempt = app.getCurrentAppAttempt(); if (attempt != null) { Container masterContainer = attempt.getMasterContainer(); if (masterContainer != null) { this.amContainerLogsExist = true; this.amContainerLogs = WebAppUtils.getRunningLogURL( schemePrefix + masterContainer.getNodeHttpAddress(), ConverterUtils.toString(masterContainer.getId()), app.getUser()); this.amHostHttpAddress = masterContainer.getNodeHttpAddress(); } ApplicationResourceUsageReport resourceReport = attempt .getApplicationResourceUsageReport(); if (resourceReport != null) { Resource usedResources = resourceReport.getUsedResources(); allocatedMB = usedResources.getMemorySize(); allocatedVCores = usedResources.getVirtualCores(); runningContainers = resourceReport.getNumUsedContainers(); queueUsagePercentage = resourceReport.getQueueUsagePercentage(); clusterUsagePercentage = resourceReport.getClusterUsagePercentage(); } resourceRequests = ((AbstractYarnScheduler) rm.getRMContext().getScheduler()) .getPendingResourceRequestsForAttempt(attempt.getAppAttemptId()); } } // copy preemption info fields RMAppMetrics appMetrics = app.getRMAppMetrics(); numAMContainerPreempted = appMetrics.getNumAMContainersPreempted(); preemptedResourceMB = appMetrics.getResourcePreempted().getMemorySize(); numNonAMContainerPreempted = appMetrics.getNumNonAMContainersPreempted(); preemptedResourceVCores = appMetrics.getResourcePreempted().getVirtualCores(); memorySeconds = appMetrics.getMemorySeconds(); vcoreSeconds = appMetrics.getVcoreSeconds(); unmanagedApplication = appSubmissionContext.getUnmanagedAM(); appNodeLabelExpression = app.getApplicationSubmissionContext().getNodeLabelExpression(); amNodeLabelExpression = (unmanagedApplication) ? null : app.getAMResourceRequest().getNodeLabelExpression(); } } public boolean isTrackingUrlReady() { return !this.trackingUrlIsNotReady; } public ApplicationId getApplicationId() { return this.applicationId; } public String getAppId() { return this.id; } public String getAppIdNum() { return this.appIdNum; } public String getUser() { return this.user; } public String getQueue() { return this.queue; } public String getName() { return this.name; } public YarnApplicationState getState() { return this.state; } public float getProgress() { return this.progress; } public String getTrackingUI() { return this.trackingUI; } public String getNote() { return this.diagnostics; } public FinalApplicationStatus getFinalStatus() { return this.finalStatus; } public String getTrackingUrl() { return this.trackingUrl; } public String getTrackingUrlPretty() { return this.trackingUrlPretty; } public long getStartTime() { return this.startedTime; } public long getFinishTime() { return this.finishedTime; } public long getElapsedTime() { return this.elapsedTime; } public String getAMContainerLogs() { return this.amContainerLogs; } public String getAMHostHttpAddress() { return this.amHostHttpAddress; } public boolean amContainerLogsExist() { return this.amContainerLogsExist; } public long getClusterId() { return this.clusterId; } public String getApplicationType() { return this.applicationType; } public String getApplicationTags() { return this.applicationTags; } public int getRunningContainers() { return this.runningContainers; } public long getAllocatedMB() { return this.allocatedMB; } public long getAllocatedVCores() { return this.allocatedVCores; } public long getPreemptedMB() { return preemptedResourceMB; } public long getPreemptedVCores() { return preemptedResourceVCores; } public int getNumNonAMContainersPreempted() { return numNonAMContainerPreempted; } public int getNumAMContainersPreempted() { return numAMContainerPreempted; } public long getMemorySeconds() { return memorySeconds; } public long getVcoreSeconds() { return vcoreSeconds; } public List<ResourceRequest> getResourceRequests() { return this.resourceRequests; } public LogAggregationStatus getLogAggregationStatus() { return this.logAggregationStatus; } public boolean isUnmanagedApp() { return unmanagedApplication; } public int getPriority() { return this.priority; } public String getAppNodeLabelExpression() { return this.appNodeLabelExpression; } public String getAmNodeLabelExpression() { return this.amNodeLabelExpression; } }