You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yarn-commits@hadoop.apache.org by tu...@apache.org on 2013/05/10 00:15:59 UTC
svn commit: r1480809 - in /hadoop/common/trunk/hadoop-yarn-project: ./
hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/
hadoop-yarn/hadoop-yarn-server/hadoop-yarn-s...
Author: tucu
Date: Thu May 9 22:15:58 2013
New Revision: 1480809
URL: http://svn.apache.org/r1480809
Log:
YARN-655. Fair scheduler metrics should subtract allocated memory from available memory. (sandyr via tucu)
Modified:
hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt
hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java
hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java
hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
Modified: hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt?rev=1480809&r1=1480808&r2=1480809&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt Thu May 9 22:15:58 2013
@@ -367,6 +367,9 @@ Release 2.0.5-beta - UNRELEASED
YARN-637. FS: maxAssign is not honored. (kkambatl via tucu)
+ YARN-655. Fair scheduler metrics should subtract allocated memory from
+ available memory. (sandyr via tucu)
+
Release 2.0.4-alpha - 2013-04-25
INCOMPATIBLE CHANGES
Modified: hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java?rev=1480809&r1=1480808&r2=1480809&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java (original)
+++ hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java Thu May 9 22:15:58 2013
@@ -43,6 +43,7 @@ import org.apache.hadoop.yarn.api.record
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
+import org.apache.hadoop.yarn.util.BuilderUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -425,6 +426,10 @@ public class QueueMetrics implements Met
public int getAppsFailed() {
return appsFailed.value();
}
+
+ public Resource getAllocatedResources() {
+ return BuilderUtils.newResource(allocatedMB.value(), 0);
+ }
public int getAllocatedMB() {
return allocatedMB.value();
Modified: hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java?rev=1480809&r1=1480808&r2=1480809&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java (original)
+++ hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java Thu May 9 22:15:58 2013
@@ -234,10 +234,6 @@ public class FairScheduler implements Re
// Recursively compute fair shares for all queues
// and update metrics
rootQueue.recomputeShares();
-
- // Update recorded capacity of root queue (child queues are updated
- // when fair share is calculated).
- rootMetrics.setAvailableResourcesToQueue(clusterCapacity);
}
/**
@@ -670,6 +666,7 @@ public class FairScheduler implements Re
} else {
application.containerCompleted(rmContainer, containerStatus, event);
node.releaseContainer(container);
+ updateRootQueueMetrics();
}
LOG.info("Application " + applicationAttemptId +
@@ -681,6 +678,7 @@ public class FairScheduler implements Re
private synchronized void addNode(RMNode node) {
nodes.put(node.getNodeID(), new FSSchedulerNode(node));
Resources.addTo(clusterCapacity, node.getTotalCapability());
+ updateRootQueueMetrics();
LOG.info("Added node " + node.getNodeAddress() +
" cluster capacity: " + clusterCapacity);
@@ -689,6 +687,7 @@ public class FairScheduler implements Re
private synchronized void removeNode(RMNode rmNode) {
FSSchedulerNode node = nodes.get(rmNode.getNodeID());
Resources.subtractFrom(clusterCapacity, rmNode.getTotalCapability());
+ updateRootQueueMetrics();
// Remove running containers
List<RMContainer> runningContainers = node.getRunningContainers();
@@ -901,6 +900,7 @@ public class FairScheduler implements Re
if ((assignedContainers >= maxAssign) && (maxAssign > 0)) { break; }
}
}
+ updateRootQueueMetrics();
}
@Override
@@ -922,6 +922,18 @@ public class FairScheduler implements Re
}
return new SchedulerAppReport(applications.get(appAttemptId));
}
+
+ /**
+ * Subqueue metrics might be a little out of date because fair shares are
+ * recalculated at the update interval, but the root queue metrics needs to
+ * be updated synchronously with allocations and completions so that cluster
+ * metrics will be consistent.
+ */
+ private void updateRootQueueMetrics() {
+ rootMetrics.setAvailableResourcesToQueue(
+ Resources.subtract(
+ clusterCapacity, rootMetrics.getAllocatedResources()));
+ }
@Override
public QueueMetrics getRootQueueMetrics() {
Modified: hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java?rev=1480809&r1=1480808&r2=1480809&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java (original)
+++ hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java Thu May 9 22:15:58 2013
@@ -68,6 +68,7 @@ import org.apache.hadoop.yarn.server.res
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer;
import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAddedSchedulerEvent;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppRemovedSchedulerEvent;
@@ -128,6 +129,7 @@ public class TestFairScheduler {
public void tearDown() {
scheduler = null;
resourceManager = null;
+ QueueMetrics.clearQueueMetrics();
}
private Configuration createConfiguration() {
@@ -337,6 +339,13 @@ public class TestFairScheduler {
assertEquals(1024, scheduler.getQueueManager().getQueue("queue1").
getResourceUsage().getMemory());
+
+ // verify metrics
+ QueueMetrics queue1Metrics = scheduler.getQueueManager().getQueue("queue1")
+ .getMetrics();
+ assertEquals(1024, queue1Metrics.getAllocatedMB());
+ assertEquals(1024, scheduler.getRootQueueMetrics().getAllocatedMB());
+ assertEquals(512, scheduler.getRootQueueMetrics().getAvailableMB());
}
@Test (timeout = 5000)
@@ -1276,6 +1285,7 @@ public class TestFairScheduler {
scheduler.handle(updateEvent);
assertEquals(1, app.getLiveContainers().size());
+ assertEquals(0, scheduler.getRootQueueMetrics().getAvailableMB());
// Create request at higher priority
createSchedulingRequestExistingApplication(1024, 1, attId);
@@ -1291,6 +1301,7 @@ public class TestFairScheduler {
// Complete container
scheduler.allocate(attId, new ArrayList<ResourceRequest>(),
Arrays.asList(containerId));
+ assertEquals(1024, scheduler.getRootQueueMetrics().getAvailableMB());
// Schedule at opening
scheduler.update();
@@ -1302,6 +1313,7 @@ public class TestFairScheduler {
for (RMContainer liveContainer : liveContainers) {
Assert.assertEquals(2, liveContainer.getContainer().getPriority().getPriority());
}
+ assertEquals(0, scheduler.getRootQueueMetrics().getAvailableMB());
}
@Test
@@ -1606,4 +1618,24 @@ public class TestFairScheduler {
assertEquals(1, app.getLiveContainers().size());
assertEquals(0, app.getReservedContainers().size());
}
+
+ @Test
+ public void testRemoveNodeUpdatesRootQueueMetrics() {
+ assertEquals(0, scheduler.getRootQueueMetrics().getAvailableMB());
+
+ RMNode node1 = MockNodes.newNodeInfo(1, Resources.createResource(1024));
+ NodeAddedSchedulerEvent addEvent = new NodeAddedSchedulerEvent(node1);
+ scheduler.handle(addEvent);
+
+ assertEquals(1024, scheduler.getRootQueueMetrics().getAvailableMB());
+ scheduler.update(); // update shouldn't change things
+ assertEquals(1024, scheduler.getRootQueueMetrics().getAvailableMB());
+
+ NodeRemovedSchedulerEvent removeEvent = new NodeRemovedSchedulerEvent(node1);
+ scheduler.handle(removeEvent);
+
+ assertEquals(0, scheduler.getRootQueueMetrics().getAvailableMB());
+ scheduler.update(); // update shouldn't change things
+ assertEquals(0, scheduler.getRootQueueMetrics().getAvailableMB());
+ }
}