mapreduce类中的奇怪错误

时间:2014-08-19 18:00:24

标签: java hadoop mapreduce

这个错误似乎微不足道,但它不会消失。我定义了以下类:

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中都有效,我正在使用的版本......

2 个答案:

答案 0 :(得分:6)

确实,您正在将旧的mapred API与新的mapreduce API混合使用。

基本上Hadoop mapreduce支持两个不兼容的API,您必须决定使用哪个API。我可能会感到困惑,因为他们共享具有相同或相似名称的类。你应该仔细查看你的import语句。

两种API都可以实现几乎相同的功能。 mapred尚未弃用或删除,也不会中断遗留应用程序。 mapreduce是相同的API,设计稍好一些。

如果您要开始一个新项目,我建议您使用新项目。但这不是什么大问题。简单的解决方法是更改​​org.apache.hadoop.mapreduce.Mapper导入语句。

答案 1 :(得分:1)

编写Driver类后遇到相同的错误,下面是错误 Job类型中的setReducerClass(Class)方法不适用于参数(Class)

获得此错误的原因:在创建reducer类之后,我立即在setReducerClass()中传递了类名;没有定义reducer类。 该函数期望实际扩展Reducer的类名,它将抛出相同的错误,直到传递的参数按照方法预期的参数类型。