如何解决Hadoop Map Reduce程序
| 当我尝试基于Hadoop 0.20 API的Hadoop in Action书中的Map Reduce编程示例时,出现了错误 java.io.IOException:类型与地图中的值不匹配:预期的org.apache.hadoop.io.IntWritable,收到的org.apache.hadoop.io.Text 但据我检查,我通过的一切都正确。如果有人可以帮助我,那将真的很有帮助。 这是代码。它与书中的代码相同。@SuppressWarnings(\"unused\")
public class CountPatents extends Configured implements Tool {
@SuppressWarnings(\"deprecation\")
public static class MapClass extends MapReduceBase implements Mapper<Text,Text,Text> {
public void map(Text key,Text value,OutputCollector<Text,Text> output,Reporter reporter) throws IOException {
output.collect(value,key);
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text,IntWritable> {
public void reduce(Text key,Iterator<Text> values,IntWritable> output,Reporter reporter) throws IOException {
int count=0;
while(values.hasNext()){
count=count+1;
values.next();
}
output.collect(key,new IntWritable(count));
}
}
public int run(String[] args) throws Exception {
Configuration conf = getConf();
JobConf job = new JobConf(conf,CountPatents.class);
Path in = new Path(args[0]);
Path out = new Path(args[1]);
FileInputFormat.setInputPaths(job,in);
FileOutputFormat.setoutputPath(job,out);
job.setJobName(\"MyJob\");
job.setMapperClass(MapClass.class);
job.setReducerClass(Reduce.class);
job.setInputFormat(keyvalueTextInputFormat.class);
job.setoutputFormat(textoutputFormat.class);
job.setoutputKeyClass(Text.class);
job.setoutputValueClass(Text.class);
job.set(\"key.value.separator.in.input.line\",\",\");
JobClient.runJob(job);
return 0;
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(),new CountPatents(),args);
System.exit(res);
}
}
解决方法
快速浏览(不在本地运行代码),看起来您在设置
这样设置
job.setOutputValueClass(Text.class);
时将作业的输出设置为文本类型,但是化简器的输出类型设置为IntWritable。这很可能是错误。
, 未接来电:
job.setMapOutputValueClass(IntWritable.class);
使用新的0.20接口和新的\“ Job \”对象代替JobConf时,也会出现相同的问题。
, 减速器的输出中应该有错误:
您的资源类定义如下:
公共静态类Reduce扩展MapReduceBase实现Reducer
因此输出值应为IntWritable类型。
但是,您提到了
job.setOutputValueClass(Text.class);
因此,按照配置,reducer的输出应为Text。
解:
在配置中,添加以下行
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
和修改:
job.setOutputValueClass(IntWritable.class);
然后尝试运行
, 地图发出job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
setMapOutputKeyClass setMapOutputValueClass
, 在化简函数中,您正在使用OutputCollector,这意味着Output键类的类型为Text,而Output value类的类型为IntWritable。
但是,在主(运行)功能中,您已经设置了job.setOutputKeyClass(Text.class);。 job.setOutputValueClass(Text.class);。
将job.setOutputValueClass(Text.class)更改为job.setOutputValueClass(IntWritable.class),您就可以开始了!
另外,最好设置MapperOutputKeyType和MapperOutputValueType以避免任何差异。 Hadoop使用基于可写接口的机制而不是本机Java序列化机制。与Java序列化机制不同,此方法不会将类名封装在序列化的实体中。因此,需要显式的类名才能将这些类从Mapper实例化为Reducer,因为在不知道将类反序列化为(Reducer输入键和值实例)的情况下,无法对表示可写实例的字节数组进行反序列化是不可能的。需要通过在Job实例上调用setMapOutputKeyClass和setMapOutputValueClass来显式提供此信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。