2016-06-10 11 views
0

Ich schreibe ein Programm in Hadoop, um den höchsten Angestellten nach Geschlecht in verschiedenen Altersgruppen zu finden, der erfolgreich ausgeführt wird, aber die Ausgabedateien sind leer. Für weitere Informationen lesen Sie bitte http://www.tutorialspoint.com/map_reduce/map_reduce_quick_guide.htmMap Reduce Ausgabedatei ist leer

Programm

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); 
    } 
} 

Das Programm ist erfolgreich läuft, aber es ist Ausgabedatei keine Ausgabe angezeigt wird. Hier ist meine Ausgabe:

screenshot showing output

+1

Sehen Sie Ausnahmen für den Kartenaufruf? Basierend auf den Zählern, die Sie angegeben haben, wurden 18 Datensätze gelesen, aber der Map-Job spuckte 0 Datensätze aus. Da Mapper 0 Datensätze ausgibt, wird Reducer nichts verarbeiten und Ihre Ausgabedatei wird daher leer sein. – Amit

+0

'WARN io.ReadaheadPool: Fehler beim Lesen von ifile EBADF: Fehlerhafter Dateideskriptor ' Ich erhalte diese Warnung –

+0

Vielleicht können Sie sehen, ob der Partitionierer das Problem ist, Sie könnten ihn entfernen und einen Identity Reducer oder Zero Reducers verwenden, nur um zu sehen, ob der Mapper Daten ausgibt. –

Antwort

0

Vielleicht job.setOutputValueClass(Text.class);job.setOutputValueClass(IntWritable.class);

Die Reduzierungen Signatur ist Reducer<Text,Text,Text,IntWritable> sein sollte.

+0

Die Ausgabe ist immer noch gleich –