¿Cuál es el propósito de la fase de orden aleatorio y ordenado en el reductor en la programación de Map Reduce?

113

En la programación de Map Reduce, la fase de reducción tiene como sub-partes barajar, ordenar y reducir. La clasificación es un asunto costoso.

¿Cuál es el propósito de la fase de orden aleatorio y ordenado en el reductor en la programación de Map Reduce?

Nithin K Anil
fuente
3
Siempre asumí que esto era necesario ya que la salida del mapeador es la entrada para el reductor, por lo que se ordenó en función del espacio de teclas y luego se dividió en cubos para cada entrada del reductor.
BasicHorizon

Respuestas:

171

En primer lugar shufflingestá el proceso de transferencia de datos de los mapeadores a los reductores, por lo que creo que es obvio que es necesario para los reductores, ya que de lo contrario, no podrían tener ninguna entrada (o entrada de cada mapeador) . La reproducción aleatoria puede comenzar incluso antes de que finalice la fase del mapa, para ahorrar algo de tiempo. Es por eso que puede ver un estado de reducción superior al 0% (pero inferior al 33%) cuando el estado del mapa aún no es del 100%.

Sortingahorra tiempo al reductor, lo que le ayuda a distinguir fácilmente cuándo debe comenzar una nueva tarea de reducción. Simplemente inicia una nueva tarea de reducción, cuando la siguiente clave en los datos de entrada ordenados es diferente a la anterior, en pocas palabras. Cada tarea de reducción toma una lista de pares clave-valor, pero tiene que llamar al método reduce () que toma una entrada de lista clave (valor), por lo que tiene que agrupar valores por clave. Es fácil hacerlo si los datos de entrada se preordenan (localmente) en la fase de mapa y simplemente se combinan en la fase de reducción (ya que los reductores obtienen datos de muchos mapeadores).

Partitioning, que mencionaste en una de las respuestas, es un proceso diferente. Determina en qué reductor se enviará un par (clave, valor), salida de la fase del mapa. El particionador predeterminado usa un hash en las claves para distribuirlas a las tareas de reducción, pero puede anularlo y usar su propio particionador personalizado.

Una gran fuente de información para estos pasos es este tutorial de Yahoo .

Una buena representación gráfica de esto es la siguiente (la reproducción aleatoria se llama "copiar" en esta figura):

ingrese la descripción de la imagen aquí

Tenga en cuenta que shufflingy sortingno se realizan en absoluto si especifica reductores cero (setNumReduceTasks (0)). Luego, el trabajo MapReduce se detiene en la fase del mapa y la fase del mapa no incluye ningún tipo de clasificación (por lo que incluso la fase del mapa es más rápida).

ACTUALIZACIÓN: Ya que está buscando algo más oficial, también puede leer el libro de Tom White "Hadoop: The Definitive Guide". Aquí está la parte interesante de su pregunta.
Tom White ha sido un comprometido con Apache Hadoop desde febrero de 2007, y es miembro de Apache Software Foundation, así que supongo que es bastante creíble y oficial ...

vefthym
fuente
"La clasificación le ahorra tiempo al reductor, lo que le ayuda a distinguir fácilmente cuándo debe comenzar una nueva tarea de reducción. Simplemente comienza una nueva tarea de reducción, cuando la siguiente clave en los datos de entrada clasificados es diferente a la anterior, en pocas palabras". No entiendo esta parte. Mapper usa un particionador para dividir los derrames en particiones localmente, cada partición luego se envía a una reducción. ¿Cómo ayuda la clasificación aquí?
MaxNevermind
1
@MaxNevermind Si tiene x reducir tareas (particiones), no significa que terminará llamando al método reduce () x veces. Se llamará una vez para cada clave distinta. Entonces, una tarea de reducción puede llamar al método reduce () varias veces.
vefthym
"Se llamará una vez para cada clave distinta" ¿Por qué? El asignador forma particiones de la forma que quiera (no es necesaria una partición para cada clave distinta), luego cada partición va al reductor, ¿está mal?
MaxNevermind
1
@MaxNevermind Mapper genera claves y valores, no forma particiones. Las particiones se definen por el número de tareas de reducción que define el usuario y la implementación del particionador. Las salidas de todos los mapeadores que tienen la misma clave van al mismo método reduce (). Esto no se puede cambiar. Pero lo que se puede cambiar es qué otras claves (si las hay) se colocarán en la misma partición y, por lo tanto, serán manejadas por la misma tarea. Una tarea de reducción puede llamar a la función reduce () más de una vez, pero solo una vez para cada tecla.
vefthym
2
ok, creo que lo tengo. Mi problema fue que olvidé que reduce toma una lista de valores como argumento, no solo un par clave-valor. Creo que debería desarrollar esto en su respuesta: "Cada tarea de reducción toma una lista de pares clave-valor, pero tiene que llamar al método de reducción que toma una lista de claves <valor>, por lo que tiene que agrupar valores por clave, es fácil qué hacer si los datos de entrada están preordenados en una etapa de mapeador "
MaxNevermind
42

Repasemos las fases clave del programa Mapreduce.

La fase del mapa la realizan los mapeadores. Los mapeadores se ejecutan en pares clave / valores de entrada sin clasificar. Cada asignador emite cero, uno o varios pares clave / valor de salida para cada par clave / valor de entrada.

La fase de combinación se realiza mediante combinadores. El combinador debe combinar pares clave / valor con la misma clave. Cada combinador puede funcionar cero, una o varias veces.

La fase de barajar y ordenar la realiza el marco. Los datos de todos los mapeadores se agrupan por clave, se dividen entre reductores y se ordenan por clave. Cada reductor obtiene todos los valores asociados a la misma clave. El programador puede proporcionar funciones de comparación personalizadas para ordenar y un particionador para dividir los datos.

El particionador decide qué reductor obtendrá un par clave-valor en particular.

El reductor obtiene pares clave / [lista de valores] ordenados, ordenados por clave. La lista de valores contiene todos los valores con la misma clave producidos por los mapeadores. Cada reductor emite cero, uno o varios pares clave / valor de salida para cada par clave / valor de entrada .

Eche un vistazo a este artículo de javacodegeeks de Maria Jurcovicova y al artículo de mssqltips de Datta para una mejor comprensión

A continuación se muestra la imagen del artículo de safaribooksonline

ingrese la descripción de la imagen aquí

Ravindra babu
fuente
Creo que hay un error tipográfico en la imagen (que me doy cuenta de que se acaba de copiar aquí). Creo que las iecadenas de Reductores y Salida deberían ser is.
Jeff Evans
32

Pensé en agregar algunos puntos que faltaban en las respuestas anteriores. Este diagrama tomado de aquí indica claramente lo que realmente está sucediendo.

ingrese la descripción de la imagen aquí

Si vuelvo a afirmar el verdadero propósito de

  • Dividir: mejora el procesamiento paralelo al distribuir la carga de procesamiento entre diferentes nodos (mapeadores), lo que ahorraría el tiempo total de procesamiento.

  • Combinar: reduce la salida de cada asignador. Ahorraría el tiempo invertido en mover los datos de un nodo a otro.

  • Ordenar (Ordenar y Ordenar): Facilita el tiempo de ejecución para programar (generar / iniciar) nuevos reductores, mientras que mientras se revisa la lista de elementos ordenados, siempre que la clave actual es diferente de la anterior, puede generar un nuevo reductor .

Supun Wijerathne
fuente
¿Dónde entraría el paso de partición en este gráfico? ¿Después del mapa y antes de combinar?
Joel
@Joel Espero que te refieras al paso 'dividido'.
Supun Wijerathne
No, me refiero al paso de partición, decide a qué reductor enviar los datos, usando un módulo hash simple por defecto, después de investigar un poco más, creo que viene después del paso de combinación, antes de barajar y ordenar.
Joel
1
@Joel No tengo muy claro lo que pretendes describir. En pocas palabras, la secuencia exacta de pasos puede ser bastante específica del problema. Puedo decir que para algunos escenarios ni siquiera es necesario ordenar. Volviendo a su entrada, si hablo específicamente sobre el ejemplo de conteo de palabras simple anterior, realmente no veo ninguna necesidad de tal partición para decidir reductores. Aquí es bastante sencillo generar reducciones por clave. Pero puedo suponer que su punto puede ser válido para algunos escenarios. Francamente, no tengo una idea clara al respecto.
Supun Wijerathne
4

Algunos de los requisitos de procesamiento de datos no necesitan orden en absoluto. Syncsort había hecho que la clasificación en Hadoop se pudiera conectar. Aquí hay un buen blog de ellos sobre la clasificación. El proceso de mover los datos de los mapeadores a los reductores se llama barajar, consulte este artículo para obtener más información sobre el mismo.

Praveen Sripati
fuente
2

Siempre asumí que esto era necesario ya que la salida del mapeador es la entrada para el reductor, por lo que se ordenó en función del espacio de teclas y luego se dividió en cubos para cada entrada del reductor. Desea asegurarse de que todos los mismos valores de una clave terminen en el mismo cubo que va al reductor para que se reduzcan juntos. No tiene sentido enviar K1, V2 y K1, V4 a diferentes reductores, ya que deben estar juntos para poder reducirse.

Intenté explicarlo de la manera más simple posible.

BasicHorizon
fuente
Si queremos enviar k1, v1 y k1, v4 al mismo reductor, podemos mezclar. entonces, ¿cuál es el propósito de la clasificación?
Nithin K Anil
Realiza la clasificación por varias razones, una de las razones es que, cuando un trabajo MapReduce envía todos los pares de KV a un reductor si la entrada no está ordenada, tendría que escanear todas las salidas del Mapper para recoger cada instancia de K1, VX . mientras que si la salida del asignador se ordena tan pronto como se detecta K2, VX, usted sabe que se ha recogido todo K1, VX y ese conjunto se puede enviar a un reductor para su procesamiento, el beneficio de esto es que usted no Hay que esperar a que todos los reductores estén listos para que cada uno de ellos comience a reducir.
BasicHorizon
Además, cuando se trata de agregación, si especifica que desea agregar todo K1, V1 si la entrada al reductor se ordena tan pronto como el reductor se activa en K2, V2 sabe que no existen más instancias de K1, V1, por lo que puede terminar su agregación, mientras que si la entrada del reductor no está ordenada, tendrá que escanear toda la entrada para K1, V1
BasicHorizon
2

El barajado es el proceso mediante el cual los datos intermedios de los mapeadores se transfieren a 0,1 o más reductores. Cada reductor recibe 1 o más llaves y sus valores asociados en función del número de reductores (para una carga equilibrada). Además, los valores asociados con cada clave se ordenan localmente.

Shailvi
fuente
0

Solo hay dos cosas que MapReduce hace NATIVAMENTE: ordenar y (implementado por ordenar) GroupBy escalable.

La mayoría de las aplicaciones y los patrones de diseño de MapReduce se basan en estas dos operaciones, que se proporcionan mediante la reproducción aleatoria y la ordenación.

Evgeny Benediktov
fuente
0

Esta es una buena lectura. Espero eso ayude. En cuanto a la clasificación que le preocupa, creo que es para la operación de fusión en el último paso de Map. Cuando se realiza la operación de mapa y es necesario escribir el resultado en el disco local, se operará una fusión múltiple en las divisiones generadas desde el búfer. Y para una operación de fusión, es útil ordenar cada partición por adelantado.

hakunami
fuente
0

Bueno, en Mapreduce hay dos frases importantes llamadas Mapper y reducer, ambas son demasiado importantes, pero Reducer es obligatorio. En algunos programas, los reductores son opcionales. Ahora pase a su pregunta. Mezclar y clasificar son dos operaciones importantes en Mapreduce. First Hadoop framework toma datos estructurados / no estructurados y separa los datos en clave, valor.

Ahora el programa Mapper separa y organiza los datos en claves y valores para ser procesados. Genere valores de clave 2 y valor 2. Estos valores deben procesarse y reorganizarse en el orden adecuado para obtener la solución deseada. Ahora, esta mezcla y clasificación se realiza en su sistema local (Framework cuídalo) y procesa en el sistema local después de la limpieza del marco de proceso de los datos en el sistema local. Okay

Aquí utilizamos el combinador y la partición también para optimizar este proceso de ordenación y ordenación. Después de la disposición adecuada, esos valores clave pasan a Reducer para obtener el resultado deseado del Cliente. Finalmente, el reductor obtiene la salida deseada.

K1, V1 -> K2, V2 (escribiremos el programa Mapper), -> K2, V '(aquí baraja y suaviza los datos) -> K3, V3 Genera la salida. K4, V4.

Tenga en cuenta que todos estos pasos son solo operaciones lógicas, no cambian los datos originales.

Su pregunta: ¿Cuál es el propósito de la fase de orden aleatorio y ordenado en el reductor en la programación de reducción de mapas?

Respuesta corta: procesar los datos para obtener el resultado deseado. Mezclar es agregar los datos, reducir es obtener la salida esperada.

Venu A Positivo
fuente