【问题标题】:With Hadoop, how to change the number of mappers for a given job?使用 Hadoop,如何更改给定作业的映射器数量?
【发布时间】:2013-02-27 07:02:46
【问题描述】:

所以,我有两个作业,作业 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) 等待 tasktracker 完成启动

3) 运行作业 A

然后在我需要运行作业 B 时执行类似的操作。

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

【问题讨论】:

    标签: java hadoop mapreduce hdfs mappers


    【解决方案1】:

    在自定义 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 节点数 在您的集群中)。

    【讨论】:

    • 感谢您的帮助,但这对我根本不起作用。您是否能够使用它运行测试项目并验证它只使用了 4 个映射器插槽?据我了解,mapred.tasktracker.map.tasks.maximum 只能在服务器端设置,在 mapred-site.xml 中。我正在使用 Hadoop .20.2,不知道这是否会有所不同。
    • 我没有尝试过这个特定的配置,但是我们已经为每个作业以编程方式设置了许多其他 mapred-site 的配置。例如,我通过将以下配置设置为 1 成功地将减速器数量限制为 1:mapred.reduce.tasks。我还设置了mapred.textoutputformat.separatormapred.output.compress。因此,分享代码(使用 pastebin),你可能没有做对。
    • 再次感谢您的帮助。我尝试设置 mapred.reduce.tasks,但不幸的是,这并没有帮助。您将其他两个参数设置为什么?哦,这是我的测试项目的 pastebin:pastebin.com/2V4UV5TQ
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 2014-06-09
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多