具有身份映射器的 MapReduce 作业失败并显示 "Type mismatch in key from map"
MapReduce job with identity Mapper fails with "Type mismatch in key from map"
只是为了学习基础,我正在尝试创建一个 MapReduce 程序而不在驱动程序中定义映射器和化简器 class,以防它使用身份映射器和化简器。如果我只评论 reducer 但当我评论两者时给出错误,它工作正常。下面是我的驱动程序 class 代码。请提出建议。
任何帮助将不胜感激。提前致谢!
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;
Error Image
您的代码示例没有调用 Job#setInputFormatClass
. If the input format is not set explicitly, then the default InputFormat
is TextInputFormat
。
使用TextInputFormat
,映射器输入的键是LongWritable
instances representing the offset within the input file. The values input to the mapper are Text
。
由于您使用的是身份映射器并且没有指定化简器,作业的输出由映射器指定。身份映射器输出输入的任何内容,因此它接收 (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 作业中其他设置的假设。
只是为了学习基础,我正在尝试创建一个 MapReduce 程序而不在驱动程序中定义映射器和化简器 class,以防它使用身份映射器和化简器。如果我只评论 reducer 但当我评论两者时给出错误,它工作正常。下面是我的驱动程序 class 代码。请提出建议。
任何帮助将不胜感激。提前致谢!
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;
Error Image
您的代码示例没有调用 Job#setInputFormatClass
. If the input format is not set explicitly, then the default InputFormat
is TextInputFormat
。
使用TextInputFormat
,映射器输入的键是LongWritable
instances representing the offset within the input file. The values input to the mapper are Text
。
由于您使用的是身份映射器并且没有指定化简器,作业的输出由映射器指定。身份映射器输出输入的任何内容,因此它接收 (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 作业中其他设置的假设。