[英]Hadoop mapper and reducer value type mismatch error
我是hadoop的新手,並且遇到了此問題。 我試圖將reducer的默認Text,Integer值更改為Text,Text。 我想映射Text,IntWritable,然后在化簡器中,我想根據值是2個計數器,然后將這2個計數器寫到Text中以供收集器使用。
public class WordCountMapper extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable> {
private final IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable>
output, Reporter reporter) throws IOException {
String line = value.toString();
String[] words = line.split(",");
String[] date = words[2].split(" ");
word.set(date[0]+" "+date[1]+" "+date[2]);
if(words[0].contains("0"))
one.set(0);
else
one.set(4);
output.collect(word, one);
}
}
-----------------------------------------------------------------------------------
public class WordCountReducer extends MapReduceBase
implements Reducer<Text, IntWritable, Text, Text> {
public void reduce(Text key,Iterator<IntWritable> values,
OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
int sad = 0;
int happy = 0;
while (values.hasNext()) {
IntWritable value = (IntWritable) values.next();
if(value.get() == 0)
sad++; // process value
else
happy++;
}
output.collect(key, new Text("sad:"+sad+", happy:"+happy));
}
}
---------------------------------------------------------------------------------
public class WordCount {
public static void main(String[] args) {
JobClient client = new JobClient();
JobConf conf = new JobConf(WordCount.class);
// specify output types
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
// specify input and output dirs
FileInputFormat.addInputPath(conf, new Path("input"));
FileOutputFormat.setOutputPath(conf, new Path("output"));
// specify a mapper
conf.setMapperClass(WordCountMapper.class);
// specify a reducer
conf.setReducerClass(WordCountReducer.class);
conf.setCombinerClass(WordCountReducer.class);
client.setConf(conf);
try {
JobClient.runJob(conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我收到此錯誤:
2010年12月14日18:11:01 INFO mapred.JobClient:任務ID:try_201412100143_0008_m_000000_0,狀態:FAILED java.io.IOException:溢出在org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect(MapTask.java: 425),位於org.apache.hadoop的WordCountMapper.map(WordCountMapper.java:1)的org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:47)的WordCountMapper.map(WordCountMapper.java:1)的org.apache.hadoop處。 org.apache.hadoop.mapred.TaskTracker $ Child.main(TaskTracker.java:2209)上的mapred.MapTask.run(MapTask.java:227)原因:java.io.IOException:錯誤的值類:org.apache類.hadoop.io.Text不是org.apache.hadoop.mapred.IFile $上的org.apache.hadoop.io.IntWritable類org.apache.hadoop.mapred.Task $上的Writer.append(IFile.java:143) org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.combineAndSpill(MapTask.java)的WordCountReducer.reduce(WordCountReducer.java:1)的WordCountReducer.reduce(WordCountReducer.java:29)的CombineOutputCollector.collect(Task.java:626) :904),網址為org.apache.hadoop.mapred.MapT org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.access $ 1600(MapTask.java:286)的org.apache.hadoop.mapred.MapTask $ MapOutputBuffer $ SpillThread.run的ask $ MapOutputBuffer.sortAndSpill(MapTask.java:785) (MapTask.java:712)
此后,錯誤會重復多次。 有人可以解釋為什么會發生此錯誤嗎? 我搜索了與此類似的錯誤,但發現的所有內容都是映射器和化簡器的鍵值類型不匹配,但是正如我所看到的,我具有映射器和化簡器的匹配鍵值類型。 先感謝您。
嘗試發表評論
conf.setCombinerClass(WordCountReducer.class);
並運行。
這是因為數據緩沖區可能已滿。
還包括
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
因為Map和Reducer發出不同的鍵值數據類型。
如果兩者都發出相同的數據類型,則
job.setOutputKeyClass();
job.setOutputValueClass();
足夠。
在WordCount類的這一行中,應該
conf.setOutputValueClass(Text.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.