job.setOutputKeyClass的配置问题

本文详细解析了Hadoop MapReduce任务配置中常见的错误及解决办法,特别是针对输出类型不匹配的问题进行了深入探讨,并提供了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初学hadoop就要上项目,真是捉急啊!遇到这个配置问题,整了好久,更捉急!

问题是这样的:在配置mapreduce的job时,总是报

1. java.io.IOException: wrong value class: class org.apache.hadoop.io.NullWritable is not class org.apache.hadoop.io.IntWritable

或2. expected org.apache.hadoop.io.**, received org.apache.hadoop.io.**。

出错点在job.setOutputKeyClass(**.class);job.setOutputValueClass(**.class);

当配置成mapper的输出,会报第1个错误,配置成reducer的输出会报第2个错误。

百度了一下,说是如果只设置Output,所设置的是mapper和reducer的输出,如果两者输出一致,则ok,如果不一致,就会报错。于是添加了job.setMapOutputKeyClass(**.class);job.setMapOutputValueClass(**.class);

还是要报错(不要这样对我嘛!)


可是同事的配置却可以运行,话说这里他配的是和我是一样的呀。(人品问题?)

没有办法,把他的程序拿来仔细对比了一下,唯一的差异是他没有配置job.setCombinerClass,而我配了。原来如此(隐藏够深啊!让姐姐我找了半天)

分析原因:

如果配置了setCombinerClass(模板里配置了的),正确的数据流:mapper(k1,v1,k2,v2)->combine(k2,v2,k3,v3)->reducer(k3,v3,k4,v4)。但是通常把combineClass设置为reducer,这样,实际的数据流:mapper(k1,v1,k2,v2)->combine(k2,v2,k3,v3)->reducer(k2,v2,k3,v3)。肯定会出错呀。

因此,可以注释掉setCombinerClass,实在需要,再视情况而定。


另外,如果加了job.setMapOutputKeyClass(**.class); job.setMapOutputValueClass(**.class);那job.setOutputKeyClass(**.class);job.setOutputValueClass(**.class);设置为reducer的输出格式,如果没有设前者,那后者应该设置为mapper的输出格式。(亲测!正解!)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值