只是为了学习的基础,我正在尝试创建一个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;
错误图像
1条答案
按热度按时间5fjcxozz1#
您的代码示例不调用
Job#setInputFormatClass
. 如果未显式设置输入格式,则默认InputFormat
是TextInputFormat
.与
TextInputFormat
,输入到Map器的键是LongWritable
表示输入文件中偏移量的示例。输入到Map器的值是Text
.因为您使用的是标识Map器,并且没有指定缩减器,所以作业的输出由Map器指定。身份Map器输出输入的任何内容,因此它接收(
LongWritable
->Text
)元组作为输入,输出相同(LongWritable
->Text
)元组作为输出。代码示例中的问题如下:
这会尝试指定作业的输出键是
Text
,但如上所述,此作业的输出键实际上是LongWritable
. 这会导致图像中出现错误:如果您取消对的呼叫
Job#setOutputKeyClass
,则错误将不再发生。考虑这一点的另一种方法是认为默认的mapreduce作业有效地做到了这一点:
通过呼叫
job.setOutputKeyClass(Text.class)
,作业提交违反了默认mapreduce作业中其他设置的假设。