/** * 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.mapred; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapred.TaskStatus.State; import junit.framework.TestCase; /** * Exercise the canAssignMap and canAssignReduce methods in * CapBasedLoadManager. */ public class TestCapBasedLoadManager extends TestCase { /** * Returns a running MapTaskStatus. */ private TaskStatus getRunningMapTaskStatus() { TaskStatus ts = new MapTaskStatus(); ts.setRunState(State.RUNNING); return ts; } /** * Returns a running ReduceTaskStatus. */ private TaskStatus getRunningReduceTaskStatus() { TaskStatus ts = new ReduceTaskStatus(); ts.setRunState(State.RUNNING); return ts; } /** * Returns a TaskTrackerStatus with the specified statistics. * @param mapCap The capacity of map tasks * @param reduceCap The capacity of reduce tasks * @param runningMap The number of running map tasks * @param runningReduce The number of running reduce tasks */ private TaskTrackerStatus getTaskTrackerStatus(int mapCap, int reduceCap, int runningMap, int runningReduce) { List<TaskStatus> ts = new ArrayList<TaskStatus>(); for (int i = 0; i < runningMap; i++) { ts.add(getRunningMapTaskStatus()); } for (int i = 0; i < runningReduce; i++) { ts.add(getRunningReduceTaskStatus()); } TaskTrackerStatus tracker = new TaskTrackerStatus("tracker", "tracker_host", 1234, ts, 0, mapCap, reduceCap); return tracker; } /** * A single test of canAssignMap. */ private void oneTestCanAssignMap(float maxDiff, int mapCap, int runningMap, int totalMapSlots, int totalRunnableMap, boolean expected) { CapBasedLoadManager manager = new CapBasedLoadManager(); Configuration conf = new Configuration(); conf.setFloat("mapred.fairscheduler.load.max.diff", maxDiff); manager.setConf(conf); TaskTrackerStatus ts = getTaskTrackerStatus(mapCap, 1, runningMap, 1); assertEquals( "When maxDiff=" + maxDiff + ", with totalRunnableMap=" + totalRunnableMap + " and totalMapSlots=" + totalMapSlots + ", a tracker with runningMap=" + runningMap + " and mapCap=" + mapCap + " should " + (expected ? "" : "not ") + "be able to take more Maps.", expected, manager.canAssignMap(ts, totalRunnableMap, totalMapSlots) ); } /** * Test canAssignMap method. */ public void testCanAssignMap() { oneTestCanAssignMap(0.0f, 5, 0, 50, 1, true); oneTestCanAssignMap(0.0f, 5, 1, 50, 10, false); oneTestCanAssignMap(0.2f, 5, 1, 50, 10, true); oneTestCanAssignMap(0.0f, 5, 1, 50, 11, true); oneTestCanAssignMap(0.0f, 5, 2, 50, 11, false); oneTestCanAssignMap(0.3f, 5, 2, 50, 6, true); oneTestCanAssignMap(1.0f, 5, 5, 50, 50, false); } /** * A single test of canAssignReduce. */ private void oneTestCanAssignReduce(float maxDiff, int ReduceCap, int runningReduce, int totalReduceSlots, int totalRunnableReduce, boolean expected) { CapBasedLoadManager manager = new CapBasedLoadManager(); Configuration conf = new Configuration(); conf.setFloat("mapred.fairscheduler.load.max.diff", maxDiff); manager.setConf(conf); TaskTrackerStatus ts = getTaskTrackerStatus(1, ReduceCap, 1, runningReduce); assertEquals( "When maxDiff=" + maxDiff + ", with totalRunnableReduce=" + totalRunnableReduce + " and totalReduceSlots=" + totalReduceSlots + ", a tracker with runningReduce=" + runningReduce + " and ReduceCap=" + ReduceCap + " should " + (expected ? "" : "not ") + "be able to take more Reduces.", expected, manager.canAssignReduce(ts, totalRunnableReduce, totalReduceSlots) ); } /** * Test canAssignReduce method. */ public void testCanAssignReduce() { oneTestCanAssignReduce(0.0f, 5, 0, 50, 1, true); oneTestCanAssignReduce(0.0f, 5, 1, 50, 10, false); oneTestCanAssignReduce(0.2f, 5, 1, 50, 10, true); oneTestCanAssignReduce(0.0f, 5, 1, 50, 11, true); oneTestCanAssignReduce(0.0f, 5, 2, 50, 11, false); oneTestCanAssignReduce(0.3f, 5, 2, 50, 6, true); oneTestCanAssignReduce(1.0f, 5, 5, 50, 50, false); } }