Java 映射中的键类型不匹配:预期为org.apache.hadoop.io.Text,Received org.apache.hadoop.io.LongWritable

Java 映射中的键类型不匹配:预期为org.apache.hadoop.io.Text,Received org.apache.hadoop.io.LongWritable,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在尝试用java运行map/reducer。下面是我的档案 WordCount.java 包装计数器; 公共类WordCount扩展配置的实现工具{ 公共int运行(字符串[]arg0)引发异常{ Configuration conf=新配置(); Job Job=新作业(conf,“wordcount”); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); setMapperClas

我正在尝试用java运行map/reducer。下面是我的档案

WordCount.java

包装计数器;
公共类WordCount扩展配置的实现工具{
公共int运行(字符串[]arg0)引发异常{
Configuration conf=新配置();
Job Job=新作业(conf,“wordcount”);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
setInputFormatClass(TextInputFormat.class);
setOutputFormatClass(TextOutputFormat.class);
addInputPath(作业,新路径(“计数器输入”));
//清除以前的运行输出(如果有)
get(conf).delete(新路径(“计数器输出”),true);
setOutputPath(作业,新路径(“计数器输出”));
job.waitForCompletion(true);
返回0;
}   
公共静态void main(字符串[]args)引发异常{
int res=ToolRunner.run(新配置(),新字数(),args);
系统退出(res);
}
}
WordCountMapper.java

公共类WordCountMapper扩展
制图员{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共void映射(可长写键、文本值、OutputCollector输出、Reporter)
抛出IOException、InterruptedException{
System.out.println(“hi”);
字符串行=value.toString();
StringTokenizer标记器=新的StringTokenizer(行);
while(tokenizer.hasMoreTokens()){
set(tokenizer.nextToken());
输出。收集(字,一);
}
}
}
WordCountReducer.java

公共类WordCountReducer扩展了Reducer{
public void reduce(文本键、迭代器值、,
OutputCollector输出,Reporter报告器)引发IOException,InterruptedException{
System.out.println(“你好”);
整数和=0;
while(values.hasNext()){
sum+=values.next().get();
}
collect(key,newintwriteable(sum));
}
}
我得到以下错误

13/06/23 23:13:25 INFO jvm.JvmMetrics:使用初始化jvm度量
processName=JobTracker,sessionId=
13/06/23 23:13:25 WARN mapred.JobClient:使用GenericOptionsParser解析
论据。应用程序应该为相同的应用程序实现工具。
13/06/23 23:13:26信息输入。文件输入格式:要处理的总输入路径:1
13/06/23 23:13:26信息映射。作业客户端:正在运行作业:作业\u本地\u 0001
13/06/23 23:13:26信息输入。文件输入格式:要处理的总输入路径:1
13/06/23 23:13:26 INFO mapred.MapTask:io.sort.mb=100
13/06/23 23:13:26 INFO mapred.MapTask:data buffer=79691776/99614720
13/06/23 23:13:26信息映射。映射任务:记录缓冲区=262144/327680
13/06/23 23:13:26警告映射。本地JobRunner:job\u local\u 0001
java.io.IOException:map中的键类型不匹配:应为org.apache.hadoop.io.Text,
已接收org.apache.hadoop.io.LongWritable
位于org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:845)
位于org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:541)
在org。
apache.hadoop.mapreduce.taskInputOutContext.write(taskInputOutContext.java:80)
位于org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124)
位于org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
位于org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:621)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
在org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)上
13/06/23 23:13:27信息映射。作业客户端:映射0%减少0%
13/06/23 23:13:27信息映射。作业客户端:作业完成:作业\u本地\u 0001
13/06/23 23:13:27信息映射。作业客户端:计数器:0
我认为它无法找到Mapper和reducer类。我已经在main类中编写了代码,
它将获得默认的映射器和还原器类。

在代码中添加以下两行:

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
您使用的是
TextOutputFormat
,默认情况下,它会发出LongWritable键和文本值,但您将文本作为键和IntWritable作为值发出。你需要把这件事告诉工作人员


HTH

这可能不是你的问题,但我曾经遇到过这个愚蠢的问题。确保您没有混合新旧库,即MapRedvs mapreduce。在地图上注释@Overide和reduce方法。如果您看到错误,您没有正确地覆盖这些方法。

由于代码中设置了不正确的映射器类(输入错误:),我得到了类似的异常堆栈跟踪

job.setMapperClass(Mapper.class)//由于类型的原因,设置为org.apache.hadoop.mapreduce.Mapper
请注意,我错误地使用了mapreduce包中的Mapper类,我将其更改为自定义Mapper类:

job.setMapperClass(LogProcMapperClass.class)//LogProcMapperClass是我的自定义映射器。

在我更正映射器类后,异常得到解决。

从代码中删除此项解决了问题

super.map(key, value, context);

我的主文件中有这两行我看不到它们..设置为“Map”outputKeyClass抱歉。我的错。我试过了。但它仍然给出了同样的错误。你是如何运行你的工作的?我在ubuntu操作系统上使用EclipseIDE。我有上面列出的3个文件。我右键点击WordCount.java并运行为->在Hadoop上运行谢谢你的评论-在我的例子中,map()方法签名被错误地命名为大写字母:public void map(…)而不是public void map(…)-我能够使用@Override发现它-再次,Tnx!