java—使用hadoop,如何更改给定作业的Map器数量?

s3fp2yjn  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(377)

所以,我有两份工作,工作a和工作b。对于作业a,我希望每个节点最多有6个Map器。然而,工作b有点不同。对于作业b,每个节点只能运行一个Map器。这样做的原因并不重要——我们就说这个要求是不可协商的。我想告诉hadoop,“对于作业a,每个节点最多安排6个Map器。但是对于作业b,每个节点最多安排1个Map器?
我能想到的唯一解决办法是:
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) 在运行作业之前:
2a)关闭TaskTracker
2b)将conf.joba/mapred-site.xml复制到hadoop的conf文件夹中,替换已经在那里的mapred-site.xml
2c)重新启动TaskTracker
2d)等待TaskTracker完成启动
3) 运行作业a
然后在我需要运行作业b时执行类似的操作。
我真的不喜欢这个解决方案;它看起来很笨拙而且容易失败。有没有更好的方法来做我需要做的事?

sxpgvts3

sxpgvts31#

在自定义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节点数)。

相关问题