title: Hadoop: Reducer writing Mapper output into Output File
body: <p>I met a very very strange problem. The reducers do work but if I check the output files, I only found the output from the mappers.
  When I was trying to debug, I found the same problem with the word count sample after I changed the mappers' output value type from Longwritable to Text  </p>
  
  <pre><code>    package org.myorg;
  
  import java.io.IOException;
  import java.util.*;
  
  import org.apache.hadoop.fs.Path;
  import org.apache.hadoop.conf.*;
  import org.apache.hadoop.io.*;
  import org.apache.hadoop.mapreduce.*;
  import org.apache.hadoop.mapreduce.lib.input.*;
  import org.apache.hadoop.mapreduce.lib.output.*;
  import org.apache.hadoop.util.*;
  
  public class WordCount extends Configured implements Tool {
  
     public static class Map
         extends Mapper&lt;LongWritable, Text, Text, Text&gt; {
       private final static IntWritable one = new IntWritable(1);
       private Text word = new Text();
  
       public void map(LongWritable key, Text wtf, Context context)
           throws IOException, InterruptedException {
         String line = wtf.toString();
         StringTokenizer tokenizer = new StringTokenizer(line);
         while (tokenizer.hasMoreTokens()) {
           word.set(tokenizer.nextToken());
           context.write(word, new Text("frommapper"));
         }
       }
     }
  
     public static class Reduce
         extends Reducer&lt;Text, Text, Text, Text&gt; {
       public void reduce(Text key, Text wtfs,
           Context context) throws IOException, InterruptedException {
  /*
         int sum = 0;
         for (IntWritable val : wtfs) {
           sum += val.get();
         }
         context.write(key, new IntWritable(sum));*/
      context.write(key,new Text("can't output"));
       }
     }
  
     public int run(String [] args) throws Exception {
       Job job = new Job(getConf());
       job.setJarByClass(WordCount.class);
       job.setJobName("wordcount");
  
  
       job.setOutputKeyClass(Text.class);
       job.setMapOutputValueClass(Text.class);
         job.setOutputValueClass(Text.class);
       job.setMapperClass(Map.class);
       //job.setCombinerClass(Reduce.class);
       job.setReducerClass(Reduce.class);
  
       job.setInputFormatClass(TextInputFormat.class);
       job.setOutputFormatClass(TextOutputFormat.class);
  
       FileInputFormat.setInputPaths(job, new Path(args[0]));
       FileOutputFormat.setOutputPath(job, new Path(args[1]));
  
       boolean success = job.waitForCompletion(true);
       return success ? 0 : 1;
           }
  
     public static void main(String[] args) throws Exception {
       int ret = ToolRunner.run(new WordCount(), args);
       System.exit(ret);
     }
  }
  </code></pre>
  
  <p>here are the results </p>
  
  <pre><code>JobClient:     Combine output records=0
  12/06/13 17:37:46 INFO mapred.JobClient:     Map input records=7
  12/06/13 17:37:46 INFO mapred.JobClient:     Reduce shuffle bytes=116
  12/06/13 17:37:46 INFO mapred.JobClient:     Reduce output records=7
  12/06/13 17:37:46 INFO mapred.JobClient:     Spilled Records=14
  12/06/13 17:37:46 INFO mapred.JobClient:     Map output bytes=96
  12/06/13 17:37:46 INFO mapred.JobClient:     Combine input records=0
  12/06/13 17:37:46 INFO mapred.JobClient:     Map output records=7
  12/06/13 17:37:46 INFO mapred.JobClient:     Reduce input records=7
  </code></pre>
  
  <p>then I found the strange results in the outfile. This problem happened after I changed the output value type of map and input key type of reducer to Text no matter I changed the type of reduce output value or not. I was also forced to change job.setOutputValue(Text.class)</p>
  
  <pre><code>a   frommapper
  a   frommapper
  a   frommapper
  gg  frommapper
  h   frommapper
  sss frommapper
  sss frommapper
  </code></pre>
  
  <p>Help!</p>