hadoopnewcomer 发表于 2015-6-26 17:53:36

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:00:22

本帖最后由 tntzbzc 于 2015-6-27 01:04 编辑


API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;

然后通过conf调用setInputFormat设置输入数据的格式:
conf.setInputFormat(KeyValueTextInputFormat.class);

hadoopnewcomer 发表于 2015-6-27 09:31:38

tntzbzc 发表于 2015-6-27 01:00
API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;
...

能帮我解释下原因么?我一直有个疑问,上面说的是KeyValueTextInputFormat不是InputFormat的子类,确实我看了看源码,KeyValueTextInputFormat是继承自FileInputFormat.按这样的话,TextInputFormat 也不行才对的,因为TextInputFormat也是继承自FileInputFormat,可是我用Job的那个方法设置输入数据格式为TextInputFormat却可以通过.请问这是什么原因啊

Alkaloid0515 发表于 2015-6-27 11:04:11

hadoopnewcomer 发表于 2015-6-27 09:31
能帮我解释下原因么?我一直有个疑问,上面说的是KeyValueTextInputFormat不是InputFormat的子类,确实我看 ...

弄清接口与类之间的关系图就明白了
所有的输入格式类都继承自InputFormat,这是一个抽象类



http://www.aboutyun.com/data/attachment/forum/201403/04/182831rcdrcaqmcd1sttc8.png


更多参考:

MapReduce中InputFormat详解



hadoopnewcomer 发表于 2015-6-27 11:21:03

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

hadoopnewcomer 发表于 2015-6-27 11:22:23

tntzbzc 发表于 2015-6-27 01:00
API兼容问题,尝试定义JobConf
首先定义一个JobConf类对象(当然该对象需要初始化):
JobConf conf;
...

嗯嗯对的.是新旧API的不兼容问题
页: [1]
查看完整版本: KeyValueTextInputFormat