MAPREDUCE-6696. Add a configuration to limit the number of map tasks allowed per job. Contributed by Zhihai Xu

This commit is contained in:
Jian He 2016-05-19 19:25:16 -07:00
parent 42c22f7e3d
commit 21d2b90213
4 changed files with 45 additions and 1 deletions

View File

@ -200,6 +200,13 @@ class JobSubmitter {
conf.setInt(MRJobConfig.NUM_MAPS, maps); conf.setInt(MRJobConfig.NUM_MAPS, maps);
LOG.info("number of splits:" + maps); LOG.info("number of splits:" + maps);
int maxMaps = conf.getInt(MRJobConfig.JOB_MAX_MAP,
MRJobConfig.DEFAULT_JOB_MAX_MAP);
if (maxMaps >= 0 && maxMaps < maps) {
throw new IllegalArgumentException("The number of map tasks " + maps +
" exceeded limit " + maxMaps);
}
// write "queue admins of the queue to which job is being submitted" // write "queue admins of the queue to which job is being submitted"
// to job file. // to job file.
String queue = conf.get(MRJobConfig.QUEUE_NAME, String queue = conf.get(MRJobConfig.QUEUE_NAME,

View File

@ -425,6 +425,13 @@ public interface MRJobConfig {
"mapreduce.job.running.reduce.limit"; "mapreduce.job.running.reduce.limit";
public static final int DEFAULT_JOB_RUNNING_REDUCE_LIMIT = 0; public static final int DEFAULT_JOB_RUNNING_REDUCE_LIMIT = 0;
/* Config for Limit on the number of map tasks allowed per job
* There is no limit if this value is negative.
*/
public static final String JOB_MAX_MAP =
"mapreduce.job.max.map";
public static final int DEFAULT_JOB_MAX_MAP = -1;
/* config for tracking the local file where all the credentials for the job /* config for tracking the local file where all the credentials for the job
* credentials. * credentials.
*/ */

View File

@ -91,6 +91,14 @@
</description> </description>
</property> </property>
<property>
<name>mapreduce.job.max.map</name>
<value>-1</value>
<description>Limit on the number of map tasks allowed per job.
There is no limit if this value is negative.
</description>
</property>
<property> <property>
<name>mapreduce.job.reducer.preempt.delay.sec</name> <name>mapreduce.job.reducer.preempt.delay.sec</name>
<value>0</value> <value>0</value>

View File

@ -57,7 +57,7 @@ public class TestLocalJobSubmission {
/** /**
* test the local job submission options of * test the local job submission options of
* -jt local -libjars * -jt local -libjars.
* @throws IOException * @throws IOException
*/ */
@Test @Test
@ -106,6 +106,28 @@ public class TestLocalJobSubmission {
assertEquals("dist job res is not 0:", 0, res); assertEquals("dist job res is not 0:", 0, res);
} }
/**
* test JOB_MAX_MAP configuration.
* @throws Exception
*/
@Test
public void testJobMaxMapConfig() throws Exception {
Configuration conf = new Configuration();
conf.set(MRConfig.FRAMEWORK_NAME, "local");
conf.setInt(MRJobConfig.JOB_MAX_MAP, 0);
final String[] args = {
"-m", "1", "-r", "1", "-mt", "1", "-rt", "1"
};
int res = -1;
try {
res = ToolRunner.run(conf, new SleepJob(), args);
fail("Job should fail");
} catch (IllegalArgumentException e) {
assertTrue(e.getLocalizedMessage().contains(
"The number of map tasks 1 exceeded limit"));
}
}
private Path makeJar(Path p) throws IOException { private Path makeJar(Path p) throws IOException {
FileOutputStream fos = new FileOutputStream(new File(p.toString())); FileOutputStream fos = new FileOutputStream(new File(p.toString()));
JarOutputStream jos = new JarOutputStream(fos); JarOutputStream jos = new JarOutputStream(fos);