这个错误看起来微不足道,但它不会消失。我定义了以下类:
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.mapreduce.Mapper;
public class Anagram_Mapper extends Mapper<LongWritable, Text, Text, Text> {
在'main'函数中,我试图使用JobConf启动一个简单的mapreduce:
public static void main(String args[]){
JobConf conf = new JobConf(Anagram_Mapper.class);
conf.setJobName("anagram_mapper");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Anagram_Mapper.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
try {
JobClient.runJob(conf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Eclipse在这行抛出错误:
conf.setMapperClass(Anagram_Mapper.class);
错误是:
The method setMapperClass(Class<? extends Mapper>) in the type JobConf
is not applicable for the arguments (Class<Anagram_Mapper>)
但是,正如你在上面看到的,我的Anagram_Mapper类扩展了Mapper,对吧?所以,我不明白为什么这个错误....
编辑:有人在这里发帖,然后撤回了他们的帖子,但它帮助我朝着正确的方向前进。显然我正在使用:org.apache.hadoop.mapreduce.Mapper但JobConf。setMapperClass只接受:org.apache.hadoop.mapred.Mapper
现在我对差异有点困惑,它们似乎基本相同,API告诉我它们在Hadoop 2.2.0中都是有效的,我使用的版本....
你确实是把旧的mapred
API和新的mapreduce
API混在一起了。
基本上Hadoop mapreduce支持两个不兼容的api,你必须决定使用哪个。我可能会感到困惑,因为它们共享具有相同或相似名称的类。你应该仔细检查你的import语句。
两个API可以实现几乎相同的事情。mapred
没有被弃用,也没有被删除到没有中断遗留应用程序。mapreduce
是相同的API,但设计稍微好一些。
如果你开始一个新的项目,我建议使用新的。但这没什么大不了的。简单的修复方法是更改org.apache.hadoop.mapreduce.Mapper
import语句。
写Driver类后遇到同样的错误,如下图所示 Job类型中的setReducerClass(Class)方法不适用于参数(Class)
得到这个错误的原因:在创建reducer类之后,我立即在setReducerClass()中传递了类名;无需定义reducer类。函数期望的类名实际上扩展了Reducer,它将抛出相同的错误,直到传递的参数与方法期望的参数类型一致。