4

我正在尝试使用一项作业在 hadoop 程序中的同一输入文件上运行 2 个独立的映射器。我希望两个映射器的输出都进入一个减速器。我面临运行多个映射器的问题。我正在使用 MultipleInputs 类。它通过运行两个映射器工作正常,但昨天我注意到它只运行一个映射函数,即第二个 MultipleInputs 语句似乎覆盖了第一个。我没有发现对代码进行任何更改以突然显示这种不同的行为:(请帮助我。主要功能是:

    public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            Job job = new Job(conf, "mapper accepting whole file at once");          
            job.setOutputKeyClass(IntWritable.class);
            job.setOutputValueClass(IntWritable.class);
            job.setJarByClass(TestMultipleInputs.class);
            job.setMapperClass(Map2.class);    
            job.setMapperClass(Map1.class);  
            job.setReducerClass(Reduce.class);  
            job.setInputFormatClass(NLinesInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
            job.setMapOutputKeyClass(IntWritable.class);
**  MultipleInputs.addInputPath(job, new Path("Rec"), NLinesInputFormat.class, Map1.class);
    MultipleInputs.addInputPath(job, new Path("Rec"), NLinesInputFormat.class, Map2.class);**    
            FileOutputFormat.setOutputPath(job,new Path("testMulinput"));
              job.waitForCompletion(true);
}

最后一个 MultipleInputs 语句中使用的 Map 类都会被执行。就像在这里 Map2.class 被执行。

4

2 回答 2

2

您将无法使用两个单独Mapper的 s 同时从同一个文件中读取(至少在没有一些您应该避免的可怕的 hack-ish 诡计)。

无论如何,你不能Mapper为同一个工作设置两个类——后者的调用setMapperClass(class)总是会覆盖前者。如果您需要Mapper同时运行两个 s,则需要创建两个单独的作业,并确保集群上有足够的映射器可以同时运行它们(如果在第一个作业开始第二个作业后没有可用的映射器)作业必须等待它完成,顺序运行而不是同时运行。)

但是,由于无法保证Mappers 将同时运行,请确保 MapReduce 作业的功能不依赖于它们的并发执行。

于 2013-04-25T08:25:06.950 回答
1

两个映射器不能同时读取同一个文件。

解决方案(解决方法):创建输入文件的副本(在这种情况下,让重复的 rec 文件为 rec1)。然后用rec 输入mapper1,用rec1 输入mapper2。

两个映射器都是并行执行的,因此您不必担心减速器的输出,因为两个映射器的输出都将被打乱,以便两个文件中的相同键进入同一个减速器。

所以输出就是你想要的。

希望这对面临类似问题的其他人有所帮助。

于 2013-10-01T13:16:17.233 回答