2016-06-10 57 views
0

我在Hadoop中編寫了一個程序,用於根據不同年齡段的性別找到最高薪水的員工,該成員正在成功運行,但輸出文件爲空。欲瞭解更多信息,請參閱http://www.tutorialspoint.com/map_reduce/map_reduce_quick_guide.htmMap Reduce輸出文件爲空

計劃是

public class PartitionerExample extends Configured implements Tool 
{ 
    //Map class 

    public static class MapClass extends Mapper<LongWritable,Text,Text,Text> 
    { 
     public void map(LongWritable key, Text value, Context context) 
     { 
     try{ 
      String[] str = value.toString().split("\t", -3); 
      String gender=str[3]; 
      context.write(new Text(gender), new Text(value)); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
     } 
    } 

    //Reducer class 

    public static class ReduceClass extends Reducer<Text,Text,Text,IntWritable> 
    { 
     public int max = -1; 
     public void reduce(Text key, Iterable <Text> values, Context context) throws IOException, InterruptedException 
     { 
     max = -1; 

     for (Text val : values) 
     { 
      String [] str = val.toString().split("\t", -3); 
      if(Integer.parseInt(str[4])>max) 
      max=Integer.parseInt(str[4]); 
     } 

     context.write(new Text(key), new IntWritable(max)); 
     } 
    } 

    //Partitioner class 

    public static class CaderPartitioner extends 
    Partitioner < Text, Text > 
    { 
     @Override 
     public int getPartition(Text key, Text value, int numReduceTasks) 
     { 
     String[] str = value.toString().split("\t"); 
     int age = Integer.parseInt(str[2]); 

     if(numReduceTasks == 0) 
     { 
      return 0; 
     } 

     if(age<=20) 
     { 
      return 0; 
     } 
     else if(age>20 && age<=30) 
     { 
      return 1 % numReduceTasks; 
     } 
     else 
     { 
      return 2 % numReduceTasks; 
     } 
     } 
    } 

    @Override 
    public int run(String[] arg) throws Exception 
    { 
     Configuration conf = getConf(); 

     Job job = new Job(conf, "topsal"); 
     job.setJarByClass(PartitionerExample.class); 

     FileInputFormat.setInputPaths(job, new Path(arg[0])); 
     FileOutputFormat.setOutputPath(job,new Path(arg[1])); 

     job.setMapperClass(MapClass.class); 

     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(Text.class); 

     //set partitioner statement 

     job.setPartitionerClass(CaderPartitioner.class); 
     job.setReducerClass(ReduceClass.class); 
     job.setNumReduceTasks(3); 
     job.setInputFormatClass(TextInputFormat.class); 

     job.setOutputFormatClass(TextOutputFormat.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     System.exit(job.waitForCompletion(true)? 0 : 1); 
     return 0; 
    } 

    public static void main(String ar[]) throws Exception 
    { 
     int res = ToolRunner.run(new Configuration(), new PartitionerExample(),ar); 
     System.exit(0); 
    } 
} 

程序成功運行,但它的輸出文件沒有顯示任何輸出。這裏是我的輸出:

screenshot showing output

+1

您是否看到地圖調用的任何異常。根據你提供的計數器,似乎有18條記錄被讀取,但Map作業吐出了0條記錄。由於Mapper發出0個記錄,因此reducer將不會獲取任何要處理的內容,因此您的輸出文件將爲空。 – Amit

+0

'WARN io.ReadaheadPool:失敗readahead ifile EBADF:錯誤的文件描述符 '我得到這個警告 –

+0

也許你可以看到如果分區是問題,你可以刪除它,並使用身份縮減或零減速器,只是爲了看看映射器是否寫出數據。 –

回答

0

也許job.setOutputValueClass(Text.class);應該job.setOutputValueClass(IntWritable.class);

的減速簽名Reducer<Text,Text,Text,IntWritable>

+0

輸出仍然相同 –