2012-06-12 30 views
9

Quiero saber si la salida de 'instancia' del OutputCollector utilizada en la función de mapa: output.collect (clave, valor) esta-salida- ¿está almacenando los pares de valores clave en alguna parte? incluso si emite a la función de reducción, su debe ser un archivo intermedio, ¿verdad? ¿Qué son esos archivos? ¿Son visibles y decididos por el programador? ¿Son OutputKeyClass y OutputValueClasses que especificamos en la función principal estos lugares de almacenamiento? [Text.class y IntWritable.class]Hadoop: ¿Cómo funciona OutputCollector durante MapReduce?

Im dando el código estándar para Word Count ejemplo en MapReduce, que podemos encontrar en muchos lugares de la red.

public class WordCount { 

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
String line = value.toString(); 
StringTokenizer tokenizer = new StringTokenizer(line); 
while (tokenizer.hasMoreTokens()) { 
word.set(tokenizer.nextToken()); 
output.collect(word, one); 
} 
} 
} 

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
int sum = 0; 
while (values.hasNext()) { 
sum += values.next().get(); 
} 
output.collect(key, new IntWritable(sum)); 
} 
} 

public static void main(String[] args) throws Exception { 
JobConf conf = new JobConf(WordCount.class); 
conf.setJobName("wordcount"); 

conf.setOutputKeyClass(Text.class); 
conf.setOutputValueClass(IntWritable.class); 

conf.setMapperClass(Map.class); 
conf.setCombinerClass(Reduce.class); 
conf.setReducerClass(Reduce.class); 

conf.setInputFormat(TextInputFormat.class); 
conf.setOutputFormat(TextOutputFormat.class); 

FileInputFormat.setInputPaths(conf, new Path(args[0])); 
FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
JobClient.runJob(conf); 
} 
} 
+0

¿Por qué quiere acceder a estos archivos temporales? ¿Tienes algo específico que quieras lograr? o es solo curisoity? – adranale

+0

Quiero cambiar la ubicación de estos archivos temporales. – catty

Respuesta

2

Creo que están almacenados en ubicaciones temporales y no están disponibles para el desarrollador, a menos que cree su propia clase que implementa OutputCollector.

una vez tuve que acceder a esos archivos y resolvió el problema mediante la creación de archivos de efectos secundarios: http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html#Task+Side-Effect+Files

+0

¿Alguien tiene el código para la función .collect() de OutputCollector? – catty

3

La salida de la función de mapa se almacena en archivos temporales intermedio. Estos archivos se manejan de forma transparente por Hadoop, por lo que en un escenario normal, el programador no tiene acceso a eso. Si tiene curiosidad sobre lo que sucede dentro de cada asignador, puede revisar los registros para el trabajo respectivo, donde encontrará un archivo de registro para cada tarea de mapa.

Si desea controlar dónde se generan los archivos temporales y tener acceso a ellos, debe crear su propia clase OutputCollector, y no sé cuán fácil es eso.

Si quieres echarle un vistazo al código fuente, puedes usar svn para obtenerlo. Creo que está disponible aquí: http://hadoop.apache.org/common/version_control.html.

Cuestiones relacionadas