这个错误似乎微不足道,但它不会消失.我定义了以下类:
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{
在'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类扩展了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,您必须决定使用哪个API.我可能会感到困惑,因为他们共享具有相同或相似名称的类.您应该仔细查看您的import语句.
两种API都可以实现几乎相同的功能.mapred
尚未弃用或删除也不会破坏遗留应用程序.mapreduce
是相同的API,设计稍好一些.
如果你要开始一个新项目,我会建议你使用新项目.但这不是什么大问题.简单的解决方法是更改您的org.apache.hadoop.mapreduce.Mapper
import语句.