带有标识Map器的mapreduce作业失败,原因是“来自Map的键中的类型不匹配”

iyfjxgzm  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(356)

只是为了学习的基础,我正在尝试创建一个mapreduce程序,没有在driver类中定义mapper和reducer,以防它使用identity mapper和reducer。如果我只注解reducer,但在同时注解这两个时给出错误,这是工作正常的。下面是我的驾驶员等级代码。请建议。
任何帮助都将不胜感激。提前谢谢!

Job job = Job.getInstance(getConf(), "word count");
job.setJarByClass(WordCountRun.class);

// job.setMapperClass(WordCountMapper.class);
//job.setReducerClass(WordCountReducer.class);  

//job.setNumReduceTasks(0);

job.setOutputKeyClass(Text.class);  

// job.setOutputValueClass(IntWritable.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
return job.waitForCompletion(true) ? 0 : 1;

错误图像

5fjcxozz

5fjcxozz1#

您的代码示例不调用 Job#setInputFormatClass . 如果未显式设置输入格式,则默认 InputFormatTextInputFormat .
TextInputFormat ,输入到Map器的键是 LongWritable 表示输入文件中偏移量的示例。输入到Map器的值是 Text .
因为您使用的是标识Map器,并且没有指定缩减器,所以作业的输出由Map器指定。身份Map器输出输入的任何内容,因此它接收( LongWritable -> Text )元组作为输入,输出相同( LongWritable -> Text )元组作为输出。
代码示例中的问题如下:

job.setOutputKeyClass(Text.class);

这会尝试指定作业的输出键是 Text ,但如上所述,此作业的输出键实际上是 LongWritable . 这会导致图像中出现错误:

Error: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable

如果您取消对的呼叫 Job#setOutputKeyClass ,则错误将不再发生。
考虑这一点的另一种方法是认为默认的mapreduce作业有效地做到了这一点:

job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(Mapper.class);
job.setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(Text.class);
job.setPartitionerClass(HashPartitioner.class);
job.setNumReduceTasks(1);
job.setReducerClass(Reducer.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);

通过呼叫 job.setOutputKeyClass(Text.class) ,作业提交违反了默认mapreduce作业中其他设置的假设。

相关问题