所以,我有两个工作,工作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和容易出错。有没有更好的方法来做我需要做的事情?
答案 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节点数
在您的群集中。)