MultipleInputs无法正常工作 - Hadoop 2.5.0

时间:2014-10-17 23:33:45

标签: hadoop mapreduce

我试图编写一个程序,它有2个同时执行的映射器和一个reducer。每个映射器都有不同的输入文件。基本上,我试图做一个减少边的连接。但是当我以下列方式宣布我的工作时,我遇到了错误:

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 3) {
        System.err.println("Usage: MovieRatings <in1> <in2> <out>");
        System.exit(2);
    }

    Job job = new Job(conf, "movieratings");
    job.setJarByClass(MovieRatings.class);
    job.setMapperClass(MovieIDJoinMapper.class);
    job.setMapperClass(MovieNameJoinMapper.class);
    MultipleInputs.addInputPath(job, new Path("/temp2"), TextInputFormat.class, MovieIDJoinMapper.class);
    MultipleInputs.addInputPath(job, new Path(otherArgs[1]), TextInputFormat.class, MovieNameJoinMapper.class);
    job.setReducerClass(ReduceSideJoin.class);
    job.setNumReduceTasks(1);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[2]));

    System.exit(job.waitForCompletion(true) ? 0 : 1);

}

我无法摆脱的错误是:

The method addInputPath(JobConf, Path, Class<? extends InputFormat>, Class<? extends Mapper>) in the type MultipleInputs is not applicable for the arguments (Job, Path, Class<TextInputFormat>, Class<MovieRatings.MovieIDJoinMapper>) MovieRatings.java   /homework2/src

现在我知道如果我这样做它应该有用:

JobConf job = new JobConf();

但这也不起作用。我正在使用Hadoop 2.5.0。我知道这可能是一个问题,因为版本和API之间不匹配,但我尝试了不同的方式,似乎没有任何工作。有谁可以帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个API不匹配问题。您正在使用较新的类型,但以某种方式导入了旧的org.apache.hadoop.mapred.lib.MultipleInputs类。将其更改为以下内容,错误应该消失:

 import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;

答案 1 :(得分:0)

我也遇到了同样的错误。这里的问题一定是你可能同时使用了mapred和mapreduce库。

替换

导入org.apache.hadoop.mapred.TextInputFormat

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat