En Hadoop, ¿cuándo comienzan las tareas de reducción? ¿Comienzan después de que se completa un cierto porcentaje (umbral) de mapeadores? Si es así, ¿se fija este umbral? ¿Qué tipo de umbral se utiliza normalmente?
La fase de reducción tiene 3 pasos: barajar, ordenar, reducir. Shuffle es donde el reductor recopila los datos de cada asignador. Esto puede suceder mientras los mapeadores están generando datos, ya que es solo una transferencia de datos. Por otro lado, ordenar y reducir solo puede comenzar una vez que todos los mapeadores hayan terminado. Puede saber cuál está haciendo MapReduce observando el porcentaje de finalización del reductor: 0-33% significa que está haciendo shuffle, 34-66% es ordenado, 67% -100% es reducido. Esta es la razón por la que sus reductores a veces parecerán "atascados" al 33%: está esperando que los mapeadores terminen.
Los reductores comienzan a barajarse en función de un umbral de porcentaje de mapeadores que han terminado. Puede cambiar el parámetro para que los reductores se inicien tarde o temprano.
¿Por qué es bueno poner en marcha los reductores antes de tiempo? Porque distribuye la transferencia de datos de los mapeadores a los reductores a lo largo del tiempo, lo cual es bueno si su red es el cuello de botella.
¿Por qué es malo poner en marcha los reductores antes de tiempo? Debido a que "acaparan" reducen los espacios mientras solo copian datos y esperan que los mapeadores terminen. Otro trabajo que comienza más tarde y que realmente usará las ranuras de reducción ahora no puede usarlas.
Puede personalizar cuándo se inician los reductores cambiando el valor predeterminado de mapred.reduce.slowstart.completed.maps
in mapred-site.xml
. Un valor de 1.00
esperará a que todos los mapeadores terminen antes de iniciar los reductores. Un valor de 0.0
iniciará los reductores de inmediato. Un valor de 0.5
iniciará los reductores cuando la mitad de los mapeadores estén completos. También puede cambiar mapred.reduce.slowstart.completed.maps
trabajo por trabajo. En las nuevas versiones de Hadoop (al menos 2.4.1) el parámetro se llama esmapreduce.job.reduce.slowstart.completedmaps
(gracias usuario yegor256).
Normalmente, me gusta mantenerme por mapred.reduce.slowstart.completed.maps
encima 0.9
si el sistema alguna vez tiene varios trabajos ejecutándose a la vez. De esta forma, el trabajo no acapara los reductores cuando no hacen nada más que copiar datos. Si solo tiene un trabajo en ejecución a la vez, 0.1
probablemente sea apropiado hacerlo .
La fase de reducción puede comenzar mucho antes de que se llame a un reductor. Tan pronto como "un" mapeador finaliza el trabajo, los datos generados se someten a una clasificación y mezcla (que incluye la llamada al combinador y al particionador). La "fase" del reductor se activa en el momento en que se inicia el procesamiento de datos posterior al mapeador. A medida que se realiza este procesamiento, verá un progreso en el porcentaje de reductores. Sin embargo, todavía no se ha llamado a ninguno de los reductores. Dependiendo de la cantidad de procesadores disponibles / utilizados, la naturaleza de los datos y la cantidad de reductores esperados, es posible que desee cambiar el parámetro como se describe en @ Donald-miner anteriormente.
fuente
Por lo que entiendo, la fase Reducir comienza con la fase del mapa y sigue consumiendo el registro de los mapas. Sin embargo, dado que hay una fase de clasificación y reproducción aleatoria después de la fase de mapa, todas las salidas deben clasificarse y enviarse al reductor. Entonces, lógicamente, puede imaginar que la fase de reducción comienza solo después de la fase de mapa, pero en realidad, por razones de rendimiento, los reductores también se inicializan con los asignadores.
fuente
El porcentaje que se muestra para la fase de reducción es en realidad aproximadamente la cantidad de datos copiados de la salida de mapas a los directorios de entrada de los reductores. ¿Para saber cuándo comienza esta copia? Es una configuración que puede establecer como Donald mostró arriba. Una vez que todos los datos se copian en los reductores (es decir, 100% de reducción), es cuando los reductores comienzan a funcionar y, por lo tanto, pueden congelarse en "100% de reducción" si el código de los reductores es intensivo en E / S o CPU.
fuente
La reducción comienza solo después de que todos los mapeadores hayan pescado la tarea, Reducer tiene que comunicarse con todos los mapeadores, por lo que tiene que esperar hasta que el último mapeador haya terminado su tarea, sin embargo, el mapeador comienza a transferir datos al momento en que ha completado su tarea.
fuente
Considere un ejemplo de WordCount para comprender mejor cómo funciona la tarea de reducción de mapa. Suponga que tenemos un archivo grande, digamos una novela, y nuestra tarea es encontrar el número de veces que aparece cada palabra en el archivo. Dado que el archivo es grande, puede dividirse en diferentes bloques y replicarse en diferentes nodos de trabajo. El trabajo de conteo de palabras se compone de tareas de mapa y reducción. La tarea de mapa toma como entrada cada bloque y produce un par clave-valor intermedio. En este ejemplo, dado que estamos contando el número de apariciones de palabras, el mapeador mientras procesa un bloque daría como resultado resultados intermedios de la forma (palabra1, recuento1), (palabra2, recuento2), etc. Los resultados intermedios de todos los mapeadores es Pasó por una fase aleatoria que reordenará el resultado intermedio.
Suponga que la salida de nuestro mapa de diferentes mapeadores tiene la siguiente forma:
Mapa 1: - (es, 24) (era, 32) (y, 12)
Mapa2: - (mi, 12) (es, 23) (era, 30)
Las salidas del mapa se ordenan de tal manera que se le dan los mismos valores clave al mismo reductor. Aquí significaría que las teclas correspondientes a is, was etc van al mismo reductor, es el reductor el que produce la salida final, que en este caso sería: - (y, 12) (is, 47) (my, 12 ) (era, 62)
fuente
Las tareas de Reductor comienzan solo después de la
completion
de todos los mapeadores.Pero la transferencia de datos ocurre después de
each
Map. En realidad, es una operación de tracción.Eso significa que cada vez que el reductor le preguntará a cada tarea del mapa si tienen algunos datos para recuperar de Map. Si encuentran que algún asignador completó su tarea, Reducer extraerá los datos intermedios.
Los datos intermedios de Mapper se almacenan en formato
disk
. Y la transferencia de datos de Mapper a Reduce ocurre a través de la Red (Data Locality
no se conserva en la fase Reducir)fuente
Cuando Mapper termina su tarea, Reducer comienza su trabajo para Reducir los datos, este es el trabajo de Mapreduce.
fuente