【Hadoop】Hadoop开发中wrong key/value与type mismatch错误

在hadoop开发中需要自己定义mapper域reducer,而在定义这两个类的时候需要相应实现map与reduce方法。其实开发需要遵守的规则还是蛮固定的,但是在开发过程中遇到的问题还是挺多的。其中经常遇到的问题就是wrong key与type mismatch这两个在map输出与reduce接受输入和写出结果的时候失败。

错误1:wrong key/value的错误,一般是指你在map输出的时候,输出的value/key与reduce接受的输入不兼容导致错误抛出。完整错误堆栈如下:

java.io.IOException: wrong value class: class com.hadoop.ListWritable is not class org.apache.hadoop.io.LongWritable
	at org.apache.hadoop.mapred.IFile$Writer.append(IFile.java:167)
	at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:1157)
	at org.apache.hadoop.mapred.Task$NewCombinerRunner$OutputConverter.write(Task.java:1481)
	at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
	at com.hadoop.ItemBasedHadoop$ItemBasedReducer.reduce(ItemBasedHadoop.java:57)
	at com.hadoop.ItemBasedHadoop$ItemBasedReducer.reduce(ItemBasedHadoop.java:1)
	at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
	at org.apache.hadoop.mapred.Task$NewCombinerRunner.combine(Task.java:1502)
	at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1436)
	at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1298)
	at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:699)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:766)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)

解决办法很简单,这个时候一个是检查你在定义job的时候是否声明了map操作相应的输入与输出;还有reduce的时候是否声明了相应的输入与输出,注意这两个是不同的,分别有相应的方法声明。

map:job.setMapOutputValueClass(LongWritable.class);                      reduce: job.setOutputKeyClass(LongWritable.class);              
            job.setMapOutputKeyClass(LongWritable.class);                                            job.setOutputValueClass(ListWritable.class);

然后检查第二点,是否定义了job.setCombinerClass(MyReducer.class);这个方法的主要作用就是在map输出给reduce的时候不再以每条记录的形式输出,而是相应的把key相同的记录整合一下再输出给reduce做最后的整合。这个方法虽然一般会定义reduce作为其class ,但是其却工作在map阶段。当map的输出与reduce的输出不同的时候,就会报上面的错误。这也是最经常包上面的错误的原因。那什么时候可以使用setCombinerClass这个方法那,当map的输出与reduce的输出都是相同类型的时候,就可以使用了。就比如wordcount。


错误2:type mismatch,一般是发生在你设置输出或者输入的key与value不匹配的时候,会导致此错误错误堆栈一般如下:

java.io.IOException: Type mismatch in value from map: expected com.free4lab.hadoop.ListWritable, recieved org.apache.hadoop.io.LongWritable
	at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1019)
	at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
	at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
	at com.hadoop.ItemBasedHadoop$ItemBasedMapper.map(ItemBasedHadoop.java:35)
	at com.hadoop.ItemBasedHadoop$ItemBasedMapper.map(ItemBasedHadoop.java:1)
	at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)


在我代码里有这么一句job.setMapOutputKeyClass(LongWritable.class); job.setMapOutputValueClass(ListWritable.class);代码的意思是本来希望输出是一个ListWritable(这是我实现的一个list类型的writebale对象),但是map的输出确实LongWriteable的,这个时候只要修改相应的输出对象与map的输出相同即可解决错误




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值