2

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

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

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

2)在我运行作业 A 之前:

2a) 关闭我的任务跟踪器

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

2c)重新启动我的任务跟踪器

2d) 等待任务跟踪器完成启动

3) 运行作业 A

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

我真的不喜欢这个解决方案;它看起来很笨拙且容易失败。有没有更好的方法来做我需要做的事情?

4

1 回答 1

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 * Number of tasktracker Nodes in your cluster)。

于 2013-03-12T07:22:33.297 回答