我正在使用hadoop核心0.20.2并且在尝试为我的作业设置输入格式时遇到了不兼容类型的问题。我正试图让一个简单的wordcount程序运行。
这是我的主要方法:
public static void main(String[] args) throws Exception{
JobConf conf = new JobConf(Wordcount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.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]));
JobClient.runJob(conf);
}
在conf.setInputFormat(TextInputFormat.class);
行上,我收到错误incompatible types class<TextInputFormat> cannot be converted to Class<? extends InputFormat>
当我看一下setInputFormat方法时,我看到:
public void setInputFormat(Class<? extends InputFormat> theClass) {
}
虽然我不能100%确定我收集的Class<? extends InputFormat> theClass
意味着我必须通过一个扩展InputFormat的类。如果我走错了路,请告诉我。
所以当我看一下TextInputFormat类时,我看到了:
public class TextInputFormat extends FileInputFormat<LongWritable, Text>
所以我传递了一个扩展FileInputFormat和NOT InputFormat的类。
但我相信FileInputFormat扩展了InputFormat,因为我在声明中看到了
public abstract class FileInputFormat<K extends Object, V extends Object> extends InputFormat<K, V>
我是否理解为什么会收到此错误?或者我完全错了,通过一个将正确的类扩展到任何n度的类是有效的吗?
我对Java很新,甚至更新Hadoop。我想要指出,我也在线上出错
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
读作&#34;不兼容的类型:JobConf无法转换为Job&#34;。我知道0.20.2不是Hadoop的最新版本,但我必须使用这个版本。在新版本的Hadoop中,我遇到了创建作业配置的其他方法,并开始认为我遇到了问题,因为我可能会引用我们在0.20.2之后添加的类。
我正在阅读在线资源以帮助获取工作副本,但我从不知道正在使用的是什么版本。所以我现在可能有不匹配的代码。任何帮助将不胜感激。
答案 0 :(得分:3)
看看这些类来自哪些包。您应该使用一组包含“mapred”作为一个级别的包或另一个具有“mapreduce”作为一个级别的包。我怀疑你是在混合包,你需要使用其他包中的TextInputFormat。