共计 1127 个字符,预计需要花费 3 分钟才能阅读完成。
在第一次使用 oozie 来管理 mapreduce 工作流时,出现了如下异常:
java.io.IOException: Type mismatch in key from map: expected org.apache.Hadoop.io.LongWritable, recieved org.apache.hadoop.io.Text
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:872)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:499) 以上错误,相信是大家在刚开始使用 hadoop 的时候都会遇到的错误,出错是因为输出格式的数据类型不匹配。
hadoopOutputCollector 对象默认的存放数据的格式为 <LongWritable,Text>,但在本例中,key 传入的实际值为 Text 类型,所以会报错,现在需要设置其输出格式,改为 <Text,LongWritable> 类型。以前写的 mapreduce 是从 main 方法里进行驱动和运行的,在 main 方法里面设置了如下参数:
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
以上参数是设置输出格式(及 key 和 value 类型)。但在 oozie 中,直接配置的是 map 类,无法从 main 方法运行,所以必须指定输出格式,有如下两种方法:
1. 在 map 类里面加入静态代码块(在类初始化的时候就会执行)
static{
JobConf conf = new JobConf();
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
}
2. 在 oozie 的 workflow.xml 中进行配置,参考如下:
<property>
<name>mapred.output.key.class</name>
<value>org.apache.hadoop.io.Text</value>
</property>
<property>
<name>mapred.output.value.class</name>
<value>org.apache.hadoop.io.IntWritable</value>
</property>
注,要在 lib 目录下把 hadoop-core-0.20.2-cdh3u6.jar 包放进去