| /** |
| * 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; |
| |
| import static org.junit.Assert.assertNotNull; |
| |
| import java.io.IOException; |
| import java.util.Collection; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.net.NetworkTopology; |
| import org.apache.hadoop.yarn.api.records.NodeHealthStatus; |
| import org.apache.hadoop.yarn.api.records.Priority; |
| import org.apache.hadoop.yarn.api.records.Resource; |
| import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store; |
| import org.apache.hadoop.yarn.server.resourcemanager.recovery.StoreFactory; |
| import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources; |
| import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class TestResourceManager { |
| private static final Log LOG = LogFactory.getLog(TestResourceManager.class); |
| |
| private ResourceManager resourceManager = null; |
| |
| @Before |
| public void setUp() throws Exception { |
| Configuration conf = new Configuration(); |
| Store store = StoreFactory.getStore(conf); |
| resourceManager = new ResourceManager(store); |
| resourceManager.init(conf); |
| } |
| |
| @After |
| public void tearDown() throws Exception { |
| } |
| |
| private org.apache.hadoop.yarn.server.resourcemanager.NodeManager |
| registerNode(String hostName, int containerManagerPort, int httpPort, |
| String rackName, int memory) throws IOException { |
| return new org.apache.hadoop.yarn.server.resourcemanager.NodeManager( |
| hostName, containerManagerPort, httpPort, rackName, memory, |
| resourceManager.getResourceTrackerService(), resourceManager |
| .getRMContext()); |
| } |
| |
| // @Test |
| public void testResourceAllocation() throws IOException { |
| LOG.info("--- START: testResourceAllocation ---"); |
| |
| final int memory = 4 * 1024; |
| |
| // Register node1 |
| String host1 = "host1"; |
| org.apache.hadoop.yarn.server.resourcemanager.NodeManager nm1 = |
| registerNode(host1, 1234, 2345, NetworkTopology.DEFAULT_RACK, memory); |
| nm1.heartbeat(); |
| |
| // Register node2 |
| String host2 = "host2"; |
| org.apache.hadoop.yarn.server.resourcemanager.NodeManager nm2 = |
| registerNode(host2, 1234, 2345, NetworkTopology.DEFAULT_RACK, memory/2); |
| nm2.heartbeat(); |
| |
| // Submit an application |
| Application application = new Application("user1", resourceManager); |
| application.submit(); |
| |
| application.addNodeManager(host1, 1234, nm1); |
| application.addNodeManager(host2, 1234, nm2); |
| |
| // Application resource requirements |
| final int memory1 = 1024; |
| Resource capability1 = Resources.createResource(memory1); |
| Priority priority1 = |
| org.apache.hadoop.yarn.server.resourcemanager.resource.Priority.create(1); |
| application.addResourceRequestSpec(priority1, capability1); |
| |
| Task t1 = new Task(application, priority1, new String[] {host1, host2}); |
| application.addTask(t1); |
| |
| final int memory2 = 2048; |
| Resource capability2 = Resources.createResource(memory2); |
| Priority priority0 = |
| org.apache.hadoop.yarn.server.resourcemanager.resource.Priority.create(0); // higher |
| application.addResourceRequestSpec(priority0, capability2); |
| |
| // Send resource requests to the scheduler |
| application.schedule(); |
| |
| // Send a heartbeat to kick the tires on the Scheduler |
| nm1.heartbeat(); |
| |
| // Get allocations from the scheduler |
| application.schedule(); |
| |
| nm1.heartbeat(); |
| checkResourceUsage(nm1, nm2); |
| |
| LOG.info("Adding new tasks..."); |
| |
| Task t2 = new Task(application, priority1, new String[] {host1, host2}); |
| application.addTask(t2); |
| |
| Task t3 = new Task(application, priority0, new String[] {RMNode.ANY}); |
| application.addTask(t3); |
| |
| // Send resource requests to the scheduler |
| application.schedule(); |
| checkResourceUsage(nm1, nm2); |
| |
| // Send a heartbeat to kick the tires on the Scheduler |
| LOG.info("Sending hb from host2"); |
| nm2.heartbeat(); |
| |
| LOG.info("Sending hb from host1"); |
| nm1.heartbeat(); |
| |
| // Get allocations from the scheduler |
| LOG.info("Trying to allocate..."); |
| application.schedule(); |
| |
| nm1.heartbeat(); |
| nm2.heartbeat(); |
| checkResourceUsage(nm1, nm2); |
| |
| // Complete tasks |
| LOG.info("Finishing up tasks..."); |
| application.finishTask(t1); |
| application.finishTask(t2); |
| application.finishTask(t3); |
| |
| // Send heartbeat |
| nm1.heartbeat(); |
| nm2.heartbeat(); |
| checkResourceUsage(nm1, nm2); |
| |
| LOG.info("--- END: testResourceAllocation ---"); |
| } |
| |
| @Test |
| public void testNodeHealthReportIsNotNull() throws Exception{ |
| String host1 = "host1"; |
| final int memory = 4 * 1024; |
| org.apache.hadoop.yarn.server.resourcemanager.NodeManager nm1 = |
| registerNode(host1, 1234, 2345, NetworkTopology.DEFAULT_RACK, memory); |
| nm1.heartbeat(); |
| nm1.heartbeat(); |
| Collection<RMNode> values = resourceManager.getRMContext().getRMNodes().values(); |
| for (RMNode ni : values) |
| { |
| NodeHealthStatus nodeHealthStatus = ni.getNodeHealthStatus(); |
| String healthReport = nodeHealthStatus.getHealthReport(); |
| assertNotNull(healthReport); |
| } |
| } |
| |
| private void checkResourceUsage( |
| org.apache.hadoop.yarn.server.resourcemanager.NodeManager... nodes ) { |
| for (org.apache.hadoop.yarn.server.resourcemanager.NodeManager nodeManager : nodes) { |
| nodeManager.checkResourceUsage(); |
| } |
| } |
| |
| } |