KeyValueTextInputFormat
今天在看关于Hadoop(版本0.20.2)的内置数据输入格式的时候看见了KeyValueTextInputFormat,于是就想试试这个类,下面是代码Configuration conf=new Configuration();String [] arg=new GenericOptionsParser(conf,args).getRemainingArgs();
conf.set("key.value.separator.in.input.line",",");
Job job=new Job(conf,"Index");
job.setJarByClass(test9.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(KeyValueTextInputFormat.class);
FileInputFormat.addInputPath(job, new Path(arg));
FileOutputFormat.setOutputPath(job, new Path(arg));
System.exit(job.waitForCompletion(true)?0:1);
然后ecplise报错:The method setInputFormatClass(Class<? extends InputFormat>) in the type Job is not applicable for the arguments
(Class<KeyValueTextInputFormat>)
http://lucene.472066.n3.nabble.com/No-KeyValueTextInputFormat-in-hadoop-0-20-2-td894459.html
https://issues.apache.org/jira/browse/MAPREDUCE-655
倒是看完了上面的两个帖子,但是还是不知道怎么回事啊.
本帖最后由 tntzbzc 于 2015-6-27 01:04 编辑
API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;
然后通过conf调用setInputFormat设置输入数据的格式:
conf.setInputFormat(KeyValueTextInputFormat.class);
tntzbzc 发表于 2015-6-27 01:00
API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;
...
能帮我解释下原因么?我一直有个疑问,上面说的是KeyValueTextInputFormat不是InputFormat的子类,确实我看了看源码,KeyValueTextInputFormat是继承自FileInputFormat.按这样的话,TextInputFormat 也不行才对的,因为TextInputFormat也是继承自FileInputFormat,可是我用Job的那个方法设置输入数据格式为TextInputFormat却可以通过.请问这是什么原因啊
hadoopnewcomer 发表于 2015-6-27 09:31
能帮我解释下原因么?我一直有个疑问,上面说的是KeyValueTextInputFormat不是InputFormat的子类,确实我看 ...
弄清接口与类之间的关系图就明白了
所有的输入格式类都继承自InputFormat,这是一个抽象类
http://www.aboutyun.com/data/attachment/forum/201403/04/182831rcdrcaqmcd1sttc8.png
更多参考:
MapReduce中InputFormat详解
Alkaloid0515 发表于 2015-6-27 11:04
弄清接口与类之间的关系图就明白了
所有的输入格式类都继承自InputFormat,这是一个抽象类
谢谢上面的二位,我知道问题出在什么地方了,我引入了下面的包import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.util.*;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.Job;
问题出在最后的两行代码上.因为我使用的是Mapreduce的中的Job类进行作业控制.同时呢我使用的又是mapred包中的KeyValueTextInputFormat进行Job的属性设置.但是mapred是hadoop的旧API包,Mapreduce是hadoop的新的API包.两者不能混着用.问题出在这里.我改了之后只使用旧包进行设置就行了.可以看看这个hadoop mapred与MapReduce
tntzbzc 发表于 2015-6-27 01:00
API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;
...
嗯嗯对的.是新旧API的不兼容问题
页:
[1]