2012-10-01 53 views
5

todosReductor Hadoop no se llama

Tengo simple mapa/reducir la implementación. Se llama a Mapper y hace su trabajo pero nunca se llama al reductor.

Aquí es mapeador:

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

Aquí es mi reductor:

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

} 

Y, aquí es parte de configuración:

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

¿Alguien tiene alguna idea de por qué reductor no es siendo invocado?

+0

¿Puede compartir sus contadores para conteos de entrada/salida de mapas, combiner y reductores? –

Respuesta

6

Ok, fue mi culpa, como esperaba. La configuración del trabajo no fue buena. Esta es la forma en que debe ser similar:

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; 

producido el problema, porque el mapa y reducir fases tienen diferentes tipos de salida. El trabajo falló silenciosamente después de invocar el método context.write. Entonces, lo que tuve que agregar son estas líneas:

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(InteractionWritable.class); 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(Text.class); 
0
  1. Espero que el text en su método Mapper tenga algunos datos.
  2. ¿Realmente necesita el Reducer para ser el Combiner así como el Reducer?

siempre tengo una clase principal InteractionMapReduce y dentro de ella tengo el InteractionMap y la clase InteractionReduce.

Así que al configurar la clase Mapper y Reducer en el trabajo, los configuré como InteractionMapReduce.InteractionMap.class y InteractionMapReduce.InteractionReduce.class.

No sé si esto podría ayudarlo, pero podría intentarlo.

+0

1. Tiene. Los datos de entrada tienen alrededor de 1000 líneas de texto csv. 2. No lo hago, pero eliminarlo como combinador no resuelve el problema. – ezamur

+0

Agregó un punto. – JHS

+0

Visto. La firma del reductor está bien, la revisé con api docs. – ezamur