diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/AMRMClientImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/AMRMClientImpl.java index 071c1ee..5d9c466 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/AMRMClientImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/AMRMClientImpl.java @@ -113,18 +113,26 @@ /** - * Class compares Resource by memory then cpu in reverse order + * Class compares Resource by memory then cpu then vDisks in reverse order */ - class ResourceReverseMemoryThenCpuComparator implements Comparator { + class ResourceReverseMemoryThenCpuThenVdisksComparator implements Comparator { @Override public int compare(Resource arg0, Resource arg1) { int mem0 = arg0.getMemory(); int mem1 = arg1.getMemory(); int cpu0 = arg0.getVirtualCores(); int cpu1 = arg1.getVirtualCores(); + int vdisks0 = arg0.getVirtualDisks(); + int vdisks1 = arg1.getVirtualDisks(); if(mem0 == mem1) { if(cpu0 == cpu1) { - return 0; + if (vdisks0 == vdisks1) { + return 0; + } + if (vdisks0 < vdisks1) { + return 1; + } + return -1; } if(cpu0 < cpu1) { return 1; @@ -143,8 +151,10 @@ static boolean canFit(Resource arg0, Resource arg1) { int mem1 = arg1.getMemory(); int cpu0 = arg0.getVirtualCores(); int cpu1 = arg1.getVirtualCores(); - - if(mem0 <= mem1 && cpu0 <= cpu1) { + int vdisks0 = arg0.getVirtualDisks(); + int vdisks1 = arg1.getVirtualDisks(); + + if(mem0 <= mem1 && cpu0 <= cpu1 && vdisks0 <= vdisks1) { return true; } return false; @@ -623,7 +633,7 @@ private void addResourceRequestToAsk(ResourceRequest remoteRequest) { if (reqMap == null) { // capabilities are stored in reverse sorted order. smallest last. reqMap = new TreeMap( - new ResourceReverseMemoryThenCpuComparator()); + new ResourceReverseMemoryThenCpuThenVdisksComparator()); remoteRequests.put(resourceName, reqMap); } ResourceRequestInfo resourceRequestInfo = reqMap.get(capability); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java index e24b5f6..7e51b3a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java @@ -140,7 +140,7 @@ public static void setup() throws Exception { priority = Priority.newInstance(1); priority2 = Priority.newInstance(2); - capability = Resource.newInstance(1024, 1); + capability = Resource.newInstance(1024, 1, 1); node = nodeReports.get(0).getNodeId().getHost(); rack = nodeReports.get(0).getRackName(); @@ -171,7 +171,7 @@ public void startApp() throws Exception { new HashMap(), null, new HashMap()); appContext.setAMContainerSpec(amContainer); - appContext.setResource(Resource.newInstance(1024, 1)); + appContext.setResource(Resource.newInstance(1024, 1, 1)); // Create the request to send to the applications manager SubmitApplicationRequest appRequest = Records .newRecord(SubmitApplicationRequest.class); @@ -230,13 +230,13 @@ public void testAMRMClientMatchingFit() throws YarnException, IOException { amClient.start(); amClient.registerApplicationMaster("Host", 10000, ""); - Resource capability1 = Resource.newInstance(1024, 2); - Resource capability2 = Resource.newInstance(1024, 1); - Resource capability3 = Resource.newInstance(1000, 2); - Resource capability4 = Resource.newInstance(2000, 1); - Resource capability5 = Resource.newInstance(1000, 3); - Resource capability6 = Resource.newInstance(2000, 1); - Resource capability7 = Resource.newInstance(2000, 1); + Resource capability1 = Resource.newInstance(1024, 2, 2); + Resource capability2 = Resource.newInstance(1024, 1, 1); + Resource capability3 = Resource.newInstance(1000, 2, 2); + Resource capability4 = Resource.newInstance(2000, 1, 1); + Resource capability5 = Resource.newInstance(1000, 3, 3); + Resource capability6 = Resource.newInstance(2000, 1, 1); + Resource capability7 = Resource.newInstance(2000, 1, 1); ContainerRequest storedContainer1 = new ContainerRequest(capability1, nodes, racks, priority); @@ -264,7 +264,7 @@ public void testAMRMClientMatchingFit() throws YarnException, IOException { List> matches; ContainerRequest storedRequest; // exact match - Resource testCapability1 = Resource.newInstance(1024, 2); + Resource testCapability1 = Resource.newInstance(1024, 2, 2); matches = amClient.getMatchingRequests(priority, node, testCapability1); verifyMatches(matches, 1); storedRequest = matches.get(0).iterator().next(); @@ -272,7 +272,7 @@ public void testAMRMClientMatchingFit() throws YarnException, IOException { amClient.removeContainerRequest(storedContainer1); // exact matching with order maintained - Resource testCapability2 = Resource.newInstance(2000, 1); + Resource testCapability2 = Resource.newInstance(2000, 1, 1); matches = amClient.getMatchingRequests(priority, node, testCapability2); verifyMatches(matches, 2); // must be returned in the order they were made @@ -287,11 +287,11 @@ public void testAMRMClientMatchingFit() throws YarnException, IOException { amClient.removeContainerRequest(storedContainer6); // matching with larger container. all requests returned - Resource testCapability3 = Resource.newInstance(4000, 4); + Resource testCapability3 = Resource.newInstance(4000, 4, 4); matches = amClient.getMatchingRequests(priority, node, testCapability3); assert(matches.size() == 4); - Resource testCapability4 = Resource.newInstance(1024, 2); + Resource testCapability4 = Resource.newInstance(1024, 2, 2); matches = amClient.getMatchingRequests(priority, node, testCapability4); assert(matches.size() == 2); // verify non-fitting containers are not returned and fitting ones are @@ -304,13 +304,13 @@ public void testAMRMClientMatchingFit() throws YarnException, IOException { testRequest == storedContainer3); } - Resource testCapability5 = Resource.newInstance(512, 4); + Resource testCapability5 = Resource.newInstance(512, 4, 4); matches = amClient.getMatchingRequests(priority, node, testCapability5); assert(matches.size() == 0); // verify requests without relaxed locality are only returned at specific // locations - Resource testCapability7 = Resource.newInstance(2000, 1); + Resource testCapability7 = Resource.newInstance(2000, 1, 1); matches = amClient.getMatchingRequests(priority2, ResourceRequest.ANY, testCapability7); assert(matches.size() == 0); @@ -344,7 +344,7 @@ public void testAMRMClientMatchingFitInferredRack() throws YarnException, IOExce amClient.start(); amClient.registerApplicationMaster("Host", 10000, ""); - Resource capability = Resource.newInstance(1024, 2); + Resource capability = Resource.newInstance(1024, 2, 2); ContainerRequest storedContainer1 = new ContainerRequest(capability, nodes, null, priority); @@ -549,7 +549,7 @@ public void testAllocationWithBlacklist() throws YarnException, IOException { // create a invalid ContainerRequest - memory value is minus ContainerRequest invalidContainerRequest = - new ContainerRequest(Resource.newInstance(-1024, 1), + new ContainerRequest(Resource.newInstance(-1024, 1, 1), nodes, racks, priority); amClient.addContainerRequest(invalidContainerRequest); amClient.updateBlacklist(localNodeBlacklist, null); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientContainerRequest.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientContainerRequest.java index cb8c86a..db510bc 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientContainerRequest.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientContainerRequest.java @@ -46,7 +46,7 @@ public void testFillInRacks() { MyResolver.class, DNSToSwitchMapping.class); client.init(conf); - Resource capability = Resource.newInstance(1024, 1); + Resource capability = Resource.newInstance(1024, 1, 1); ContainerRequest request = new ContainerRequest(capability, new String[] {"host1", "host2"}, new String[] {"/rack2"}, Priority.newInstance(1)); @@ -68,7 +68,7 @@ public void testDisableLocalityRelaxation() { MyResolver.class, DNSToSwitchMapping.class); client.init(conf); - Resource capability = Resource.newInstance(1024, 1); + Resource capability = Resource.newInstance(1024, 1, 1); ContainerRequest nodeLevelRequest = new ContainerRequest(capability, new String[] {"host1", "host2"}, null, Priority.newInstance(1), false); @@ -135,7 +135,7 @@ public void testDifferentLocalityRelaxationSamePriority() { MyResolver.class, DNSToSwitchMapping.class); client.init(conf); - Resource capability = Resource.newInstance(1024, 1); + Resource capability = Resource.newInstance(1024, 1, 1); ContainerRequest request1 = new ContainerRequest(capability, new String[] {"host1", "host2"}, null, Priority.newInstance(1), false); @@ -156,7 +156,7 @@ public void testInvalidValidWhenOldRemoved() { MyResolver.class, DNSToSwitchMapping.class); client.init(conf); - Resource capability = Resource.newInstance(1024, 1); + Resource capability = Resource.newInstance(1024, 1, 1); ContainerRequest request1 = new ContainerRequest(capability, new String[] {"host1", "host2"}, null, Priority.newInstance(1), false); @@ -195,7 +195,7 @@ public void testLocalityRelaxationDifferentLevels() { MyResolver.class, DNSToSwitchMapping.class); client.init(conf); - Resource capability = Resource.newInstance(1024, 1); + Resource capability = Resource.newInstance(1024, 1, 1); ContainerRequest request1 = new ContainerRequest(capability, new String[] {"host1", "host2"}, null, Priority.newInstance(1), false);