blob: 5523d731b506bffe80c8ece0a74d8642c2bea854 [file] [log] [blame]
/**
* 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.gridmix;
import static org.junit.Assert.*;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.gridmix.DebugJobProducer.MockJob;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.MRConfig;
import org.apache.hadoop.mapreduce.MRJobConfig;
import org.apache.hadoop.mapreduce.server.jobtracker.JTConfig;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.tools.rumen.JobStory;
import org.junit.Test;
/**
* Test if Gridmix correctly configures the simulated job's configuration for
* high ram job properties.
*/
public class TestHighRamJob {
/**
* A dummy {@link GridmixJob} that opens up the simulated job for testing.
*/
protected static class DummyGridmixJob extends GridmixJob {
public DummyGridmixJob(Configuration conf, JobStory desc)
throws IOException {
super(conf, System.currentTimeMillis(), desc, new Path("test"),
UserGroupInformation.getCurrentUser(), -1);
}
/**
* Do nothing since this is a dummy gridmix job.
*/
@Override
public Job call() throws Exception {
return null;
}
@Override
protected boolean canEmulateCompression() {
// return false as we don't need compression
return false;
}
protected Job getJob() {
// open the simulated job for testing
return job;
}
}
private static void testHighRamConfig(long jobMapMB, long jobReduceMB,
long clusterMapMB, long clusterReduceMB, long simulatedClusterMapMB,
long simulatedClusterReduceMB, long expectedMapMB, long expectedReduceMB,
Configuration gConf)
throws IOException {
Configuration simulatedJobConf = new Configuration(gConf);
simulatedJobConf.setLong(MRConfig.MAPMEMORY_MB, simulatedClusterMapMB);
simulatedJobConf.setLong(MRConfig.REDUCEMEMORY_MB,
simulatedClusterReduceMB);
// define a source conf
Configuration sourceConf = new Configuration();
// configure the original job
sourceConf.setLong(MRJobConfig.MAP_MEMORY_MB, jobMapMB);
sourceConf.setLong(MRConfig.MAPMEMORY_MB, clusterMapMB);
sourceConf.setLong(MRJobConfig.REDUCE_MEMORY_MB, jobReduceMB);
sourceConf.setLong(MRConfig.REDUCEMEMORY_MB, clusterReduceMB);
// define a mock job
MockJob story = new MockJob(sourceConf);
GridmixJob job = new DummyGridmixJob(simulatedJobConf, story);
Job simulatedJob = job.getJob();
Configuration simulatedConf = simulatedJob.getConfiguration();
// check if the high ram properties are not set
assertEquals(expectedMapMB,
simulatedConf.getLong(MRJobConfig.MAP_MEMORY_MB,
JobConf.DISABLED_MEMORY_LIMIT));
assertEquals(expectedReduceMB,
simulatedConf.getLong(MRJobConfig.REDUCE_MEMORY_MB,
JobConf.DISABLED_MEMORY_LIMIT));
}
/**
* Tests high ram job properties configuration.
*/
@SuppressWarnings("deprecation")
@Test
public void testHighRamFeatureEmulation() throws IOException {
// define the gridmix conf
Configuration gridmixConf = new Configuration();
// test : check high ram emulation disabled
gridmixConf.setBoolean(GridmixJob.GRIDMIX_HIGHRAM_EMULATION_ENABLE, false);
testHighRamConfig(10, 20, 5, 10, JobConf.DISABLED_MEMORY_LIMIT,
JobConf.DISABLED_MEMORY_LIMIT,
JobConf.DISABLED_MEMORY_LIMIT,
JobConf.DISABLED_MEMORY_LIMIT, gridmixConf);
// test : check with high ram enabled (default) and no scaling
gridmixConf = new Configuration();
// set the deprecated max memory limit
gridmixConf.setLong(JobConf.UPPER_LIMIT_ON_TASK_VMEM_PROPERTY,
20*1024*1024);
testHighRamConfig(10, 20, 5, 10, 5, 10, 10, 20, gridmixConf);
// test : check with high ram enabled and scaling
gridmixConf = new Configuration();
// set the new max map/reduce memory limits
gridmixConf.setLong(JTConfig.JT_MAX_MAPMEMORY_MB, 100);
gridmixConf.setLong(JTConfig.JT_MAX_REDUCEMEMORY_MB, 300);
testHighRamConfig(10, 45, 5, 15, 50, 100, 100, 300, gridmixConf);
// test : check with high ram enabled and map memory scaling mismatch
// (deprecated)
gridmixConf = new Configuration();
gridmixConf.setLong(JobConf.UPPER_LIMIT_ON_TASK_VMEM_PROPERTY,
70*1024*1024);
Boolean failed = null;
try {
testHighRamConfig(10, 45, 5, 15, 50, 100, 100, 300, gridmixConf);
failed = false;
} catch (Exception e) {
failed = true;
}
assertNotNull(failed);
assertTrue("Exception expected for exceeding map memory limit "
+ "(deprecation)!", failed);
// test : check with high ram enabled and reduce memory scaling mismatch
// (deprecated)
gridmixConf = new Configuration();
gridmixConf.setLong(JobConf.UPPER_LIMIT_ON_TASK_VMEM_PROPERTY,
150*1024*1024);
failed = null;
try {
testHighRamConfig(10, 45, 5, 15, 50, 100, 100, 300, gridmixConf);
failed = false;
} catch (Exception e) {
failed = true;
}
assertNotNull(failed);
assertTrue("Exception expected for exceeding reduce memory limit "
+ "(deprecation)!", failed);
// test : check with high ram enabled and scaling mismatch on map limits
gridmixConf = new Configuration();
gridmixConf.setLong(JTConfig.JT_MAX_MAPMEMORY_MB, 70);
failed = null;
try {
testHighRamConfig(10, 45, 5, 15, 50, 100, 100, 300, gridmixConf);
failed = false;
} catch (Exception e) {
failed = true;
}
assertNotNull(failed);
assertTrue("Exception expected for exceeding map memory limit!", failed);
// test : check with high ram enabled and scaling mismatch on reduce
// limits
gridmixConf = new Configuration();
gridmixConf.setLong(JTConfig.JT_MAX_REDUCEMEMORY_MB, 200);
failed = null;
try {
testHighRamConfig(10, 45, 5, 15, 50, 100, 100, 300, gridmixConf);
failed = false;
} catch (Exception e) {
failed = true;
}
assertNotNull(failed);
assertTrue("Exception expected for exceeding reduce memory limit!", failed);
}
}