/** * 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 static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.util.Properties; import org.apache.hadoop.examples.SleepJob; import org.junit.Test; public class TestCapacitySchedulerWithJobTracker extends ClusterWithCapacityScheduler { /** * Test case which checks if the jobs which fail initialization are removed * from the {@link CapacityTaskScheduler} waiting queue. * * @throws Exception */ @Test public void testFailingJobInitalization() throws Exception { Properties schedulerProps = new Properties(); schedulerProps.put("mapred.capacity-scheduler.queue.default.capacity", "100"); Properties clusterProps = new Properties(); clusterProps.put("mapred.tasktracker.map.tasks.maximum", String.valueOf(1)); clusterProps.put("mapred.tasktracker.reduce.tasks.maximum", String .valueOf(1)); clusterProps.put("mapred.jobtracker.maxtasks.per.job", String.valueOf(1)); // cluster capacity 1 maps, 1 reduces startCluster(1, clusterProps, schedulerProps); JobConf conf = getJobConf(); conf.setSpeculativeExecution(false); conf.set("mapred.committer.job.setup.cleanup.needed", "false"); conf.setNumTasksToExecutePerJvm(-1); SleepJob sleepJob = new SleepJob(); sleepJob.setConf(conf); JobConf job = sleepJob.setupJobConf(3, 3, 1, 1, 1, 1); RunningJob rjob; try { rjob = runJob(job, false); fail("The job should have thrown Exception"); } catch (Exception e) { CapacityTaskScheduler scheduler = (CapacityTaskScheduler) getJobTracker() .getTaskScheduler(); JobQueuesManager mgr = scheduler.jobQueuesManager; assertEquals("Failed job present in Waiting queue", 0, mgr .getQueue("default").getNumWaitingJobs()); } } /** * Test case which checks {@link JobTracker} and {@link CapacityTaskScheduler} * * Test case submits 2 jobs in two different capacity scheduler queues. And * checks if the jobs successfully complete. * * @throws Exception */ @Test public void testJobTrackerIntegration() throws Exception { Properties schedulerProps = new Properties(); String[] queues = new String[] { "Q1", "Q2" }; RunningJob jobs[] = new RunningJob[2]; for (String q : queues) { schedulerProps.put(CapacitySchedulerConf .toFullPropertyName(q, "capacity"), "50"); schedulerProps.put(CapacitySchedulerConf.toFullPropertyName(q, "minimum-user-limit-percent"), "100"); } Properties clusterProps = new Properties(); clusterProps.put("mapred.tasktracker.map.tasks.maximum", String.valueOf(2)); clusterProps.put("mapred.tasktracker.reduce.tasks.maximum", String .valueOf(2)); clusterProps.put("mapred.queue.names", queues[0] + "," + queues[1]); startCluster(2, clusterProps, schedulerProps); JobConf conf = getJobConf(); conf.setSpeculativeExecution(false); conf.set("mapred.committer.job.setup.cleanup.needed", "false"); conf.setNumTasksToExecutePerJvm(-1); conf.setQueueName(queues[0]); SleepJob sleepJob1 = new SleepJob(); sleepJob1.setConf(conf); JobConf sleepJobConf = sleepJob1.setupJobConf(1, 1, 1, 1, 1, 1); jobs[0] = runJob(sleepJobConf, true); JobConf conf2 = getJobConf(); conf2.setSpeculativeExecution(false); conf2.set("mapred.committer.job.setup.cleanup.needed", "false"); conf2.setNumTasksToExecutePerJvm(-1); conf2.setQueueName(queues[1]); SleepJob sleepJob2 = new SleepJob(); sleepJob2.setConf(conf2); JobConf sleep2 = sleepJob2.setupJobConf(3, 3, 5, 3, 5, 3); jobs[1] = runJob(sleep2, false); assertTrue("Sleep job submitted to queue 1 is not successful", jobs[0] .isSuccessful()); assertTrue("Sleep job submitted to queue 2 is not successful", jobs[1] .isSuccessful()); } private RunningJob runJob(JobConf conf, boolean inBackGround) throws IOException { if (!inBackGround) { RunningJob rjob = JobClient.runJob(conf); return rjob; } else { RunningJob rJob = new JobClient(conf).submitJob(conf); return rJob; } } }