簡體   English   中英

Hadoop映射器和化簡器值類型不匹配錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM