Hadoop 带有标识映射器的MapReduce作业失败;“来自映射的键中的类型不匹配”;
仅作为学习基础,我正在尝试创建一个MapReduce程序,而不在驱动程序类中定义mapper和reducer,以防它使用identity mapper和reducer。如果我只注释reducer,但在同时注释两者时给出错误,则工作正常。下面是我的驾驶员等级代码。请建议 我们将非常感谢您的帮助。提前谢谢Hadoop 带有标识映射器的MapReduce作业失败;“来自映射的键中的类型不匹配”;,hadoop,mapreduce,mapper,Hadoop,Mapreduce,Mapper,仅作为学习基础,我正在尝试创建一个MapReduce程序,而不在驱动程序类中定义mapper和reducer,以防它使用identity mapper和reducer。如果我只注释reducer,但在同时注释两者时给出错误,则工作正常。下面是我的驾驶员等级代码。请建议 我们将非常感谢您的帮助。提前谢谢 Job job = Job.getInstance(getConf(), "word count"); job.setJarByClass(WordCountRun.class); // job
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;
您的代码示例未调用。如果未明确设置输入格式,则默认为 使用
TextInputFormat
,输入到映射器的键是表示输入文件中偏移量的实例。输入到映射器的值为
由于您使用的是标识映射器,并且没有指定缩减器,因此作业的输出由映射器指定。标识映射器输出输入的内容,因此它接收(LongWritable
->Text
)元组作为输入,并输出相同的(LongWritable
->Text
)元组作为输出
代码示例中的问题是这一行:
job.setOutputKeyClass(Text.class);
这试图指定作业的输出键是文本
,但如上所述,此作业的输出键实际上是可长写的
。这会导致图像中出现错误:
Error: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable
如果删除对作业#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作业中其他设置的假设