2012-06-20 14 views
8

Tengo dos clases separadas de java para hacer dos trabajos de mapreduce diferentes. Puedo ejecutarlos de forma independiente. Los archivos de entrada en los que están operando son los mismos para ambos trabajos. Así que mi pregunta es si es posible definir dos creadores de mapas y dos reductores en una clase Java comoHadoop MapReduce: ¿es posible definir dos mapeadores y reductores en una clase de trabajo de hadoop?

mapper1.class 
mapper2.class 
reducer1.class 
reducer2.class 

y luego como

job.setMapperClass(mapper1.class); 
job.setmapperClass(mapper2.class); 
job.setCombinerClass(reducer1); 
job.setCombinerClass(reducer2); 
job.setReducerClass(reducer1); 
job.setReducerClass(reducer2); 

hacer este conjunto Métodos realidad no usar los anteriores o añadir el nuevo unos? Probé el código, pero ejecuta las únicas últimas clases dadas, lo que me hace pensar que anula. Pero debe haber una forma de hacerlo bien?

La razón por la que estoy preguntando esto es que puedo leer los archivos de entrada solo una vez (una E/S) y luego procesar dos trabajos de reducción de mapas. También me gustaría saber cómo puedo escribir los archivos de salida en dos carpetas diferentes. Por el momento, ambos trabajos están separados y requieren una entrada y un directorio de salida.

Respuesta

1

Puede usar las clases MultipleInputs y MultipleOutputs para esto, pero la salida de ambos mapeadores irá a ambos reductores. Si los flujos de datos para los dos pares asignador/reductor son realmente independientes el uno del otro, consérvelos como dos trabajos separados. Por cierto, MultipleInputs ejecutará sus mapeadores sin cambio, pero los reductores tendrían que ser modificados para usar MultipleOutputs

+0

+1 Esto tiene sentido. – pyfunc

+0

@Chris Ambos pares de MR comparten la misma entrada, lo que me hizo pensar en poder leer la entrada solo una vez. Los mapeadores trabajan con diferentes claves. Esto significa que las claves para un mapeador serán diferentes de las del mapeador. La razón por la que estoy pensando es que puedo leer los archivos de entrada solo una vez para procesarlos en dos pares diferentes de MR que funcionan de forma independiente. – Bob

0

Según mi comprensión, que proviene de usar map-reduce con Hadoop streaming, puede encadenar múltiples mapeadores y reductores donde uno consume la salida de otro

Pero no debería poder ejecutar diferentes mapeadores y reductores simultáneamente. Los propios mapeadores dependen de que no se procesen bloques. Mapper debe ser instanciado en función de esa decisión y no de la variedad de asignador disponible para el trabajo.

[Editar: Basado en su comentario]

No creo que esto es posible. Puede encadenar (donde los reductores recibirán todas las entradas de los mapeadores. Puede secuenciarlas pero no puede ejecutar exclusivamente conjuntos independientes de correlacionador y reductores.

Creo que lo que puede hacer es, aunque reciba ambas entradas de los mapeadores en sus dos reductores, puede hacer que los cartógrafos salgan (K, V) de tal manera que puedan distinguir en sus reductores de qué origen fue el asignador (K, V). De esta forma, ambos reductores pueden procesar en selectivos (K, V) pares.

+0

@Bob: He editado mi respuesta en base a tu comentario – pyfunc

+0

Genial, no pensé que fuera una posibilidad. Pero, ¿cómo puedo separar los archivos de salida, decir que puedo manejarlo en mi implementación de reductor? De alguna manera, debo especificar qué claves se escriben en dónde. – Bob

+0

No Bob: No puedes hacer eso. Lo que puedes hacer en map1, map2 es enviar K, V como K, (map1, V) para que en reductor sepas de dónde vienen los datos. Cada reductor crea su propio archivo en salida de trabajo para que su salida ya esté segregada. – pyfunc

11

puede tener múltiples creadores de mapas, pero en un puesto de trabajo, que sólo puede tener un reductor. y las características que necesita son MultipleInput, MultipleOutput y GenericWritable.

Usando MultipleInput, puede establecer el asignador y el formato de entrada correspondiente. Aquí está mi post sobre cómo usarlo.

Usando GenericWritable, puede separar diferentes clases de entrada en el reductor. Aquí está mi post sobre cómo usarlo.

Utilizando MultipleOutput, puede generar diferentes clases en el mismo reductor.

+0

¡Gracias por tu comentario! Los probaré. – Bob

0

La clase ChainMapper permite utilizar múltiples clases de Mapper en una sola tarea de Mapa. Por ejemplo, mira here.

Cuestiones relacionadas