分享

KeyValueTextInputFormat

hadoopnewcomer 发表于 2015-6-26 17:53:36 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 19610
今天在看关于Hadoop(版本0.20.2)的内置数据输入格式的时候看见了KeyValueTextInputFormat,于是就想试试这个类,下面是代码[mw_shl_code=java,true]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[0]));
        FileOutputFormat.setOutputPath(job, new Path(arg[1]));
        System.exit(job.waitForCompletion(true)?0:1);         [/mw_shl_code]



然后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


倒是看完了上面的两个帖子,但是还是不知道怎么回事啊.

已有(5)人评论

跳转到指定楼层
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,这是一个抽象类






更多参考:

MapReduce中InputFormat详解



回复

使用道具 举报

hadoopnewcomer 发表于 2015-6-27 11:21:03
Alkaloid0515 发表于 2015-6-27 11:04
弄清接口与类之间的关系图就明白了
所有的输入格式类都继承自InputFormat,这是一个抽象类

谢谢上面的二位,我知道问题出在什么地方了,我引入了下面的包[mw_shl_code=java,true]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;[/mw_shl_code]

问题出在最后的两行代码上.因为我使用的是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的不兼容问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条