使用Hadoop,如何更改给定作业的映射器数量?

时间:2013-03-11 22:22:40

标签: java hadoop mapreduce hdfs mappers

所以,我有两个工作,工作A和工作B.对于工作A,我希望每个节点最多有6个映射器。但是,工作B有点不同。对于作业B,我每个节点只能运行一个映射器。其原因并不重要 - 让我们说这个要求是不可协商的。我想告诉Hadoop,“对于Job A,每个节点最多安排6个映射器。但是对于Job B,每个节点最多安排1个映射器。”这有可能吗?

我能想到的唯一解决方案是:

1)在主要的hadoop文件夹下有两个文件夹,conf.JobA和conf.JobB。每个文件夹都有自己的mapred-site.xml副本。对于mapred.tasktracker.map.tasks.maximum,conf.JobA / mapred-site.xml的值为6。对于mapred.tasktracker.map.tasks.maximum,conf.JobB / mapred-site.xml的值为1.

2)在我开始工作A之前:

2a)关闭我的tasktrackers

2b)将conf.JobA / mapred-site.xml复制到Hadoop的conf文件夹中,替换已经存在的mapred-site.xml

2c)重启我的tasktrackers

2d)等待任务人员完成启动

3)运行工作A

然后在我需要运行Job B时做类似的事情。

我真的不喜欢这个解决方案;它看起来像kludgey和容易出错。有没有更好的方法来做我需要做的事情?

1 个答案:

答案 0 :(得分:0)

在自定义jar本身的Java代码中,您可以为这两个作业设置此配置mapred.tasktracker.map.tasks.maximum

做这样的事情:

Configuration conf = getConf();

// set number of mappers
conf.setInt("mapred.tasktracker.map.tasks.maximum", 4);

Job job = new Job(conf);

job.setJarByClass(MyMapRed.class);
job.setJobName(JOB_NAME);

job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(MapJob.class);
job.setMapOutputKeyClass(Text.class);
job.setReducerClass(ReduceJob.class);
job.setMapOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.setInputPaths(job, args[0]);

boolean success = job.waitForCompletion(true);
return success ? 0 : 1;

修改

您还需要将属性mapred.map.tasks设置为派生自的值 以下公式(mapred.tasktracker.map.tasks.maximum * tasktracker节点数 在您的群集中。)