diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java index 97ab872..b0b79f9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/FairSchedulerPage.java @@ -49,6 +49,7 @@ static final String Q_INSTANTANEOUS_FS = "left:0%;background:none;border:1px dashed rgba(0,0,0,1)"; static final String Q_OVER = "background:rgba(255, 140, 0, 0.8)"; static final String Q_UNDER = "background:rgba(50, 205, 50, 0.8)"; + static final String DOMINANT_RESOURCES_TYPE = "Dominant Resources Type"; static final String STEADY_FAIR_SHARE = "Steady Fair Share"; static final String INSTANTANEOUS_FAIR_SHARE = "Instantaneous Fair Share"; @RequestScoped @@ -98,13 +99,15 @@ public void render(Block html) { UL ul = html.ul("#pq"); for (FairSchedulerQueueInfo info : subQueues) { float capacity = info.getMaxResourcesFraction(); - float steadyFairShare = info.getSteadyFairShareMemoryFraction(); - float instantaneousFairShare = info.getFairShareMemoryFraction(); - float used = info.getUsedMemoryFraction(); + float steadyFairShare = info.getSteadyFairShareResourcesFraction(); + float instantaneousFairShare = info.getFairShareResourcesFraction(); + float used = info.getUsedResourcesFraction(); + String dominantResourceType = info.getDominantResourceType().name(); LI> li = ul. li(). a(_Q).$style(width(capacity * Q_MAX_WIDTH)). - $title(join(join(STEADY_FAIR_SHARE + ":", percent(steadyFairShare)), + $title(join(join(DOMINANT_RESOURCES_TYPE + ":", dominantResourceType), + join("\n" + STEADY_FAIR_SHARE + ":", percent(steadyFairShare)), join(" " + INSTANTANEOUS_FAIR_SHARE + ":", percent(instantaneousFairShare)))). span().$style(join(Q_GIVEN, ";font-size:1px;", width(steadyFairShare / capacity))). _('.')._(). @@ -158,7 +161,7 @@ public void render(Block html) { } else { FairSchedulerInfo sinfo = new FairSchedulerInfo(fs); fsqinfo.qinfo = sinfo.getRootQueueInfo(); - float used = fsqinfo.qinfo.getUsedMemoryFraction(); + float used = fsqinfo.qinfo.getUsedResourcesFraction(); ul. li().$style("margin-bottom: 1em"). diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java index 5fbfe51..aa9dd61 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java @@ -28,28 +28,31 @@ import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlTransient; +import org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceType; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.AllocationConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSLeafQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.DominantResourceFairnessPolicy; import org.apache.hadoop.yarn.util.resource.Resources; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlSeeAlso({FairSchedulerLeafQueueInfo.class}) -public class FairSchedulerQueueInfo { +public class FairSchedulerQueueInfo { private int maxApps; + private ResourceType dominantResourceType; @XmlTransient - private float fractionMemUsed; + private float fractionResourcesUsed; @XmlTransient - private float fractionMemSteadyFairShare; + private float fractionResourcesSteadyFairShare; @XmlTransient - private float fractionMemFairShare; + private float fractionResourcesFairShare; @XmlTransient - private float fractionMemMinShare; + private float fractionResourcesMinShare; @XmlTransient - private float fractionMemMaxShare; + private float fractionResourcesMaxShare; private ResourceInfo minResources; private ResourceInfo maxResources; @@ -57,12 +60,12 @@ private ResourceInfo steadyFairResources; private ResourceInfo fairResources; private ResourceInfo clusterResources; - + private String queueName; private String schedulingPolicy; private Collection childQueues; - + public FairSchedulerQueueInfo() { } @@ -75,8 +78,10 @@ public FairSchedulerQueueInfo(FSQueue queue, FairScheduler scheduler) { clusterResources = new ResourceInfo(scheduler.getClusterResource()); usedResources = new ResourceInfo(queue.getResourceUsage()); - fractionMemUsed = (float)usedResources.getMemory() / - clusterResources.getMemory(); + + updateDominantResourceType(); + + fractionResourcesUsed = resourceInfoRatio(usedResources, clusterResources); steadyFairResources = new ResourceInfo(queue.getSteadyFairShare()); fairResources = new ResourceInfo(queue.getFairShare()); @@ -86,12 +91,10 @@ public FairSchedulerQueueInfo(FSQueue queue, FairScheduler scheduler) { Resources.componentwiseMin(queue.getMaxShare(), scheduler.getClusterResource())); - fractionMemSteadyFairShare = - (float)steadyFairResources.getMemory() / clusterResources.getMemory(); - fractionMemFairShare = (float) fairResources.getMemory() - / clusterResources.getMemory(); - fractionMemMinShare = (float)minResources.getMemory() / clusterResources.getMemory(); - fractionMemMaxShare = (float)maxResources.getMemory() / clusterResources.getMemory(); + fractionResourcesSteadyFairShare = resourceInfoRatio(steadyFairResources, clusterResources); + fractionResourcesFairShare = resourceInfoRatio(fairResources, clusterResources); + fractionResourcesMinShare = resourceInfoRatio(minResources, clusterResources); + fractionResourcesMaxShare = resourceInfoRatio(maxResources, clusterResources); maxApps = allocConf.getQueueMaxApps(queueName); @@ -110,19 +113,46 @@ public FairSchedulerQueueInfo(FSQueue queue, FairScheduler scheduler) { } } } - + + private void updateDominantResourceType() { + if (schedulingPolicy.equals(DominantResourceFairnessPolicy.NAME) + && ((float)usedResources.getvCores() / clusterResources.getvCores() + > (float)usedResources.getMemory() / clusterResources.getMemory())) { + dominantResourceType = ResourceType.CPU; + } else { + dominantResourceType = ResourceType.MEMORY; + } + } + + private float resourceInfoRatio(ResourceInfo a, ResourceInfo b) { + float ratio; + if (dominantResourceType == ResourceType.CPU) { + ratio = b.getvCores() == 0 ? 0 : (float)a.getvCores() / b.getvCores(); + } else { + ratio = b.getMemory() == 0 ? 0 : (float)a.getMemory() / b.getMemory(); + } + return Math.min(1, ratio); + } + + /** + * Returns the dominant resource type of used resources + */ + public ResourceType getDominantResourceType() { + return dominantResourceType; + } + /** * Returns the steady fair share as a fraction of the entire cluster capacity. */ - public float getSteadyFairShareMemoryFraction() { - return fractionMemSteadyFairShare; + public float getSteadyFairShareResourcesFraction() { + return fractionResourcesSteadyFairShare; } /** * Returns the fair share as a fraction of the entire cluster capacity. */ - public float getFairShareMemoryFraction() { - return fractionMemFairShare; + public float getFairShareResourcesFraction() { + return fractionResourcesFairShare; } /** @@ -163,16 +193,16 @@ public ResourceInfo getUsedResources() { * Returns the queue's min share in as a fraction of the entire * cluster capacity. */ - public float getMinShareMemoryFraction() { - return fractionMemMinShare; + public float getMinShareResourcesFraction() { + return fractionResourcesMinShare; } /** * Returns the memory used by this queue as a fraction of the entire * cluster capacity. */ - public float getUsedMemoryFraction() { - return fractionMemUsed; + public float getUsedResourcesFraction() { + return fractionResourcesUsed; } /** @@ -180,7 +210,7 @@ public float getUsedMemoryFraction() { * capacity. */ public float getMaxResourcesFraction() { - return fractionMemMaxShare; + return fractionResourcesMaxShare; } /**