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的输出格式。(亲测!正解!)


package com.dajiangtai.hadoop.tv; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class ParseAndFilterLog extends Configured implements Tool { public static class ExtractTVMsgLogMapper extends Mapper<LongWritable, Text, Text, Text, Text> { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { DataUtil.transData(value.toString(), context); } } public int run(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length < 2) { System.err.println("Usage: ParseAndFilterLog <in> <out>"); System.exit(2); } Job job = Job.getInstance(conf, "ParseAndFilterLog"); job.setJarByClass(ParseAndFilterLog.class); job.setMapperClass(ExtractTVMsgLogMapper.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); job.getConfiguration().set("mapreduce.output.textoutputformat.separator", "@"); return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(new Configuration(), new ParseAndFilterLog(), args); System.exit(exitCode); } }修改这段代码使其不报错
最新发布
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值