我试着写一个程序,有两个Map器同时执行和一个减速机。每个Map器都有不同的输入文件。基本上,我想做一个减少边连接。但当我以以下方式声明我的工作时,我会出错:
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();
但这也不管用。我正在使用hadoop2.5.0。我知道这可能是一个问题,由于版本和api之间的不匹配,但我尝试了不同的方式,似乎没有任何工作。有人能帮我吗?谢谢!
2条答案
按热度按时间kr98yfug1#
这是一个api不匹配的问题。您正在使用较新的类型,但以某种方式导入了旧的类型
org.apache.hadoop.mapred.lib.MultipleInputs
班级。将其更改为以下内容,错误将消失:eyh26e7m2#
我也犯了同样的错误。这里的问题一定是您可能同时使用了mapred和mapreduce库。
代替
导入org.apache.hadoop.mapred.textinputformat
具有
导入org.apache.hadoop.mapreduce.lib.input.textinputformat