2012-10-01 8 views
5

allIl riduttore Hadoop non viene chiamato

Ho una mappa semplice/ridurre l'implementazione. Il mapper viene chiamato e fa il suo lavoro ma il riduttore non viene mai chiamato.

Ecco mapper:

static public class InteractionMap extends Mapper<LongWritable, Text, Text, InteractionWritable> { 

    @Override 
    protected void map(LongWritable offset, Text text, Context context) throws IOException, InterruptedException { 
     System.out.println("mapper"); 
     String[] tokens = text.toString().split(","); 
     for (int idx = 0; idx < tokens.length; idx++) { 
      String sourceUser = tokens[1]; 
      String targetUser = tokens[2]; 
      int points = Integer.parseInt(tokens[4]); 
      context.write(new Text(sourceUser), new InteractionWritable(targetUser, points)); 
      } 
     } 
    } 
} 

Ecco il mio riduttore:

static public class InteractionReduce extends Reducer<Text, InteractionWritable, Text, Text> { 

    @Override 
    protected void reduce(Text token, Iterable<InteractionWritable> counts, Context context) throws IOException, InterruptedException { 
     System.out.println("REDUCER"); 
     Iterator<InteractionWritable> i = counts.iterator(); 
     while (i.hasNext()) { 
      InteractionWritable interaction = i.next(); 
      context.write(token, new Text(token.toString() + " " + interaction.getTargetUser().toString() + " " + interaction.getPoints().get())); 
     } 
    } 

} 

E, qui fa parte di configurazione:

@Override 
public int run(String[] args) throws Exception { 
    Configuration configuration = getConf(); 
    Job job = new Job(configuration, "Interaction Count"); 
    job.setJarByClass(InteractionMapReduce.class); 
    job.setMapperClass(InteractionMap.class); 
    job.setCombinerClass(InteractionReduce.class); 
    job.setReducerClass(InteractionReduce.class); 
    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(Text.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    return job.waitForCompletion(true) ? 0 : -1; 
} 

Qualcuno ha qualche idea del perché riduttore non è essere invocato?

+0

Puoi condividere i tuoi contatori per i conteggi di input/output di mappa, combinatore e riduttore? –

risposta

6

Ok, è stata colpa mia, come previsto. La configurazione del lavoro non era buona. Questo è come dovrebbe essere simile:

Configuration configuration = getConf(); 

Job job = new Job(configuration, "Interaction Count"); 
job.setJarByClass(InteractionMapReduce.class); 
job.setMapperClass(InteractionMap.class); 
job.setReducerClass(InteractionReduce.class); 
job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(InteractionWritable.class); 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(Text.class); 

FileInputFormat.addInputPath(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 

return job.waitForCompletion(true) ? 0 : -1; 

si è verificato il problema, perché mappa e ridurre fasi hanno diversi tipi di output. Il processo non è riuscito in modo silenzioso dopo aver richiamato il metodo context.write. Quindi, quello che ho dovuto aggiungere sono queste righe:

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(InteractionWritable.class); 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(Text.class); 
0
  1. Spero che il text nel tuo metodo Mapper abbia alcuni dati.
  2. Avete davvero bisogno che lo Reducer sia il Combiner e lo Reducer?

ho sempre avere una classe principale InteractionMapReduce e al suo interno ho la InteractionMap e la classe InteractionReduce.

Così, mentre l'impostazione della Mapper e la classe Reducer nel lavoro, io li impostare come InteractionMapReduce.InteractionMap.class e InteractionMapReduce.InteractionReduce.class.

Non so se questo ti potrebbe aiutare ma potresti provarlo.

+0

1. Ha. I dati di input hanno circa 1000 righe di testo csv. 2. Non lo faccio, ma rimuoverlo come un combinatore non risolve il problema. – ezamur

+0

Aggiunto un punto. – JHS

+0

Visto. La firma del riduttore è ok, l'ho controllata con documenti API. – ezamur

Problemi correlati