所以,我有两个作业,作业A和作业b。对于作业A,我希望每个节点最多有6个映射器。然而,工作B有点不同。对于作业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之前:
关闭我的任务跟踪器
2b)复制conf. joba/mapred-site.xml到Hadoop的conf文件夹中,替换已经在那里的mapred-site.xml
2c)重启我的任务跟踪器
2d)等待任务跟踪器完成启动
3)运行作业A
,然后当我需要运行作业b时做类似的事情。
我真的不喜欢这个解决方案;它似乎很笨拙,而且容易出错。有更好的方法来做我需要做的事吗?
在您的自定义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节点数