我试图编写一个程序,它有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之间不匹配,但我尝试了不同的方式,似乎没有任何工作。有谁可以帮助我吗?谢谢!
答案 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