Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 带有标识映射器的MapReduce作业失败;“来自映射的键中的类型不匹配”;_Hadoop_Mapreduce_Mapper - Fatal编程技术网

Hadoop 带有标识映射器的MapReduce作业失败;“来自映射的键中的类型不匹配”;

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

仅作为学习基础,我正在尝试创建一个MapReduce程序,而不在驱动程序类中定义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;

您的代码示例未调用。如果未明确设置输入格式,则默认为

使用
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作业中其他设置的假设