YARN-3733. Fix DominantRC#compare() does not work as expected if cluster resource is empty. (Rohith Sharmaks via wangda)
(cherry picked from commit ebd797c48f
)
This commit is contained in:
parent
1cccd1eeb3
commit
78d626fa89
|
@ -579,6 +579,9 @@ Release 2.7.1 - UNRELEASED
|
||||||
YARN-3585. NodeManager cannot exit on SHUTDOWN event triggered and NM
|
YARN-3585. NodeManager cannot exit on SHUTDOWN event triggered and NM
|
||||||
recovery is enabled (Rohith Sharmaks via jlowe)
|
recovery is enabled (Rohith Sharmaks via jlowe)
|
||||||
|
|
||||||
|
YARN-3733. Fix DominantRC#compare() does not work as expected if
|
||||||
|
cluster resource is empty. (Rohith Sharmaks via wangda)
|
||||||
|
|
||||||
Release 2.7.0 - 2015-04-20
|
Release 2.7.0 - 2015-04-20
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -53,6 +53,21 @@ public class DominantResourceCalculator extends ResourceCalculator {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isInvalidDivisor(clusterResource)) {
|
||||||
|
if ((lhs.getMemory() < rhs.getMemory() && lhs.getVirtualCores() > rhs
|
||||||
|
.getVirtualCores())
|
||||||
|
|| (lhs.getMemory() > rhs.getMemory() && lhs.getVirtualCores() < rhs
|
||||||
|
.getVirtualCores())) {
|
||||||
|
return 0;
|
||||||
|
} else if (lhs.getMemory() > rhs.getMemory()
|
||||||
|
|| lhs.getVirtualCores() > rhs.getVirtualCores()) {
|
||||||
|
return 1;
|
||||||
|
} else if (lhs.getMemory() < rhs.getMemory()
|
||||||
|
|| lhs.getVirtualCores() < rhs.getVirtualCores()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float l = getResourceAsValue(clusterResource, lhs, true);
|
float l = getResourceAsValue(clusterResource, lhs, true);
|
||||||
float r = getResourceAsValue(clusterResource, rhs, true);
|
float r = getResourceAsValue(clusterResource, rhs, true);
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.CapacitySchedule
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.CapacitySchedulerQueueInfoList;
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.CapacitySchedulerQueueInfoList;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.policy.FairOrderingPolicy;
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.policy.FairOrderingPolicy;
|
||||||
import org.apache.hadoop.yarn.server.utils.BuilderUtils;
|
import org.apache.hadoop.yarn.server.utils.BuilderUtils;
|
||||||
|
import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator;
|
||||||
import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator;
|
import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator;
|
||||||
import org.apache.hadoop.yarn.util.resource.Resources;
|
import org.apache.hadoop.yarn.util.resource.Resources;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
@ -1281,9 +1282,15 @@ public class TestCapacityScheduler {
|
||||||
|
|
||||||
private MockRM setUpMove() {
|
private MockRM setUpMove() {
|
||||||
CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration();
|
CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration();
|
||||||
|
return setUpMove(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MockRM setUpMove(Configuration config) {
|
||||||
|
CapacitySchedulerConfiguration conf =
|
||||||
|
new CapacitySchedulerConfiguration(config);
|
||||||
setupQueueConfiguration(conf);
|
setupQueueConfiguration(conf);
|
||||||
conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
|
conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
|
||||||
ResourceScheduler.class);
|
ResourceScheduler.class);
|
||||||
MockRM rm = new MockRM(conf);
|
MockRM rm = new MockRM(conf);
|
||||||
rm.start();
|
rm.start();
|
||||||
return rm;
|
return rm;
|
||||||
|
@ -2952,6 +2959,55 @@ public class TestCapacityScheduler {
|
||||||
Assert.assertEquals(queueInfoB.getDefaultNodeLabelExpression(), "y");
|
Assert.assertEquals(queueInfoB.getDefaultNodeLabelExpression(), "y");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout = 30000)
|
||||||
|
public void testAMLimitUsage() throws Exception {
|
||||||
|
|
||||||
|
CapacitySchedulerConfiguration config =
|
||||||
|
new CapacitySchedulerConfiguration();
|
||||||
|
|
||||||
|
config.set(CapacitySchedulerConfiguration.RESOURCE_CALCULATOR_CLASS,
|
||||||
|
DefaultResourceCalculator.class.getName());
|
||||||
|
verifyAMLimitForLeafQueue(config);
|
||||||
|
|
||||||
|
config.set(CapacitySchedulerConfiguration.RESOURCE_CALCULATOR_CLASS,
|
||||||
|
DominantResourceCalculator.class.getName());
|
||||||
|
verifyAMLimitForLeafQueue(config);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyAMLimitForLeafQueue(CapacitySchedulerConfiguration config)
|
||||||
|
throws Exception {
|
||||||
|
MockRM rm = setUpMove(config);
|
||||||
|
|
||||||
|
String queueName = "a1";
|
||||||
|
String userName = "user_0";
|
||||||
|
ResourceScheduler scheduler = rm.getRMContext().getScheduler();
|
||||||
|
LeafQueue queueA =
|
||||||
|
(LeafQueue) ((CapacityScheduler) scheduler).getQueue(queueName);
|
||||||
|
Resource amResourceLimit = queueA.getAMResourceLimit();
|
||||||
|
|
||||||
|
Resource amResource =
|
||||||
|
Resource.newInstance(amResourceLimit.getMemory() + 1,
|
||||||
|
amResourceLimit.getVirtualCores() + 1);
|
||||||
|
|
||||||
|
rm.submitApp(amResource.getMemory(), "app-1", userName, null, queueName);
|
||||||
|
|
||||||
|
rm.submitApp(amResource.getMemory(), "app-1", userName, null, queueName);
|
||||||
|
|
||||||
|
// When AM limit is exceeded, 1 applications will be activated.Rest all
|
||||||
|
// applications will be in pending
|
||||||
|
Assert.assertEquals("PendingApplications should be 1", 1,
|
||||||
|
queueA.getNumPendingApplications());
|
||||||
|
Assert.assertEquals("Active applications should be 1", 1,
|
||||||
|
queueA.getNumActiveApplications());
|
||||||
|
|
||||||
|
Assert.assertEquals("User PendingApplications should be 1", 1, queueA
|
||||||
|
.getUser(userName).getPendingApplications());
|
||||||
|
Assert.assertEquals("User Active applications should be 1", 1, queueA
|
||||||
|
.getUser(userName).getActiveApplications());
|
||||||
|
rm.stop();
|
||||||
|
}
|
||||||
|
|
||||||
private void setMaxAllocMb(Configuration conf, int maxAllocMb) {
|
private void setMaxAllocMb(Configuration conf, int maxAllocMb) {
|
||||||
conf.setInt(YarnConfiguration.RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
|
conf.setInt(YarnConfiguration.RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
|
||||||
maxAllocMb);
|
maxAllocMb);
|
||||||
|
|
Loading…
Reference in New Issue