2011-06-02 30 views
8

En una configuración típica de MapReduce (como Hadoop), ¿cuántos reductores se usan para 1 tarea, por ejemplo, contar palabras? Mi comprensión de ese MapReduce de Google significa que solo está involucrado 1 reductor. ¿Es eso correcto?número de reductores para 1 tarea en MapReduce

Por ejemplo, el recuento de palabras dividirá la entrada en N fragmentos, y N Map se ejecutará, produciendo la lista (palabra, #). Mi pregunta es, una vez que se haya completado la fase del Mapa, ¿habrá solo una instancia del reductor ejecutándose para calcular el resultado? o habrá reductores funcionando en paralelo?

+1

Su pregunta le falta un poco más de contexto. ¿Tiene un marco mapreduce particular al que se refiere, es decir, Hadoop? Y si es así, ¿se pregunta cuántas "tareas" de reducción se asociarán con cada "tarea" del mapa? – diliop

+1

He actualizado la pregunta. –

+0

La respuesta corta es que habrá un número configurable de reductores (al menos 1). –

Respuesta

13

La respuesta simple es que el número de reductores no tiene que ser 1 y sí, los reductores se pueden ejecutar en paralelo. Como mencioné anteriormente, esto es definido o derivado por el usuario.

Para mantener las cosas en contexto me referiré a Hadoop en este caso para que tenga una idea de cómo funcionan las cosas. Si está utilizando la API de transmisión en Hadoop (0.20.2), tendrá que definir explícitamente cuántos reductores le gustaría ejecutar, ya que de manera predeterminada solo se lanzará 1 tarea de reducción. Lo hace pasando el número de reductores al argumento -D mapred.reduce.tasks=# of reducers. La API de Java intentará derivar el número de reductores que necesitará, pero nuevamente también puede establecerlo explícitamente. En ambos casos, hay un tope fijo en la cantidad de reductores que puede ejecutar por nodo y que se establece en su archivo de configuración mapred-site.xml utilizando mapred.tasktracker.reduce.tasks.maximum.

En una nota más conceptual, puede mirar la publicación this en la wiki de hadoop que habla de elegir el número de mapas y reducir tareas.

+0

¿Qué condiciones causarían que Hadoop decidiera instanciar más de una instancia de la clase Reducer? Si establecemos el n. ° de reductores en 1, ¿realmente se garantiza que todas las claves irán a una sola instancia, sin importar cuántas? – davidmdem

+0

En algún lugar después de la versión 2.4.1, la propiedad: "mapred.tasktracker.reduce.tasks.maximum" ha quedado en desuso, el nuevo nombre de propiedad es: "mapreduce.tasktracker.reduce.tasks.maximum" Ver: http: // hadoop. apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/DeprecatedProperties.html – xgMz

1

Esto depende completamente de la situación. En algunos casos, no tiene reductores ... todo se puede hacer en el mapa. En otros casos, no puede evitar tener un reductor, pero generalmente esto viene en un segundo o tercer trabajo de mapa/reducción que condensa los resultados anteriores. ¡Generalmente, sin embargo, quiere tener muchos reductores o está perdiendo una gran parte del poder de MapReduce! En el conteo de palabras, por ejemplo, el resultado de tus mapeadores será pares. Estos pares se dividen en función de la palabra, de modo que cada reductor recibirá las mismas palabras y puede darle la suma máxima. Cada reductor luego muestra el resultado. Si quisiera, podría disparar otro trabajo M/R que tomó todos estos archivos y los concatendó, ese trabajo solo tendría un reductor.

1

I caso de simple wordcount ejemplo, tendría sentido utilizar un solo reductor.
Si desea tener como resultado del cálculo un solo número, debe usar un reductor (2 o más reductores le proporcionarían 2 o más archivos de salida).

Si este reductor tarda mucho tiempo en completarse, puede pensar en encadenar varios reductores donde los reductores en la siguiente fase sumarían los resultados de los reductores anteriores.

0

Los reductores funcionan en paralelo. La cantidad de reductor que ha configurado en su trabajo mientras cambia el archivo de configuración mapred-site.xml o al configurar el reducer mientras se ejecuta el trabajo en ejecución o puede configurarlo en el programa, también ese número de reductor se ejecutará en forma paralela. No es necesario mantenerla como 1. Por defecto su valor es 1.

+0

¿Podría elaborar más su respuesta agregando un poco más de descripción acerca de la solución que proporciona? – abarisone

+0

En un trabajo o una tarea puede tener más de un reductor. puede establecer el número de reductor de tres maneras: 1) valor de cambio en el archivo mapred-site.xml. 2) mientras ejecuta el trabajo como -D mapred.reduce.task = 4 (puede ser cualquier número). 3) configurar su objeto de configuración en el código del controlador como conf.setNumReduceTask (4); –

0

El valor por defecto es 1. Si usted está considerando la colmena o cerdo, entonces el número de reductor depende de la consulta, como por grupo, suma .....

En el caso de su código mapreduce, se puede definir mediante setNumReduceTasks en job/conf.

job.setNumReduceTasks(3); 

La mayoría de las veces se hace cuando se sobrescribe el getPartition(), es decir,está utilizando un particionador personalizado

class customPartitioner extends Partitioner<Text,Text>{ 
    public int getPartition(Text key, Text value, int numReduceTasks){ 
    if(numReduceTasks==0) 
     return 0; 
    if(some logic) 
     return 0; 
    if(some logic) 
     return 1; 
    else 
     return 2; 
    } 
} 

Una cosa que notará es la cantidad de reductores = el número de archivos de piezas en la salida.

Avísame si tienes dudas.

Cuestiones relacionadas