hadoop - procesamiento - map reduce python
¿La salida de la fase del mapa del trabajo mapreduce siempre está ordenada? (5)
Estoy un poco confundido con la salida que recibo de Mapper.
Por ejemplo, cuando ejecuto un programa simple de conteo de palabras, con este texto de entrada:
hello world
Hadoop programming
mapreduce wordcount
lets see if this works
12345678
hello world
mapreduce wordcount
este es el resultado que obtengo:
12345678 1
Hadoop 1
hello 1
hello 1
if 1
lets 1
mapreduce 1
mapreduce 1
programming 1
see 1
this 1
wordcount 1
wordcount 1
works 1
world 1
world 1
Como puede ver, la salida del asignador ya está ordenada. No Reducer
en absoluto. Pero encuentro en un proyecto diferente que la salida del mapeador no está ordenada. Así que estoy totalmente claro sobre esto ...
Mis preguntas son:
- ¿La salida del mapeador siempre está ordenada?
- ¿Ya se ha integrado la fase de clasificación en la fase del mapeador, de modo que la salida de la fase del mapa ya está ordenada en los datos intermedios?
- ¿Hay alguna forma de recopilar los datos de la fase de
sort and shuffle
y persistir antes de que se aplique Reducer? Un reductor se presenta con una clave y una lista de iterables. ¿Hay alguna manera, podría persistir esta información?
A continuación hay algunas explicaciones para sus preguntas
Encabezado ## ¿La salida de mapper siempre está ordenada?
Ya respondió @SurJanSR
Rumbo ## ¿Ya se ha integrado la fase de ordenación con la fase de mapeo, de modo que la salida de la fase del mapa ya está ordenada en los datos intermedios?
En un trabajo de Mapreduce, como usted sabe, Mapper se ejecuta en divisiones individuales de datos y en nodos donde los datos persisten. El resultado de Mapper se escribe TEMPORALMENTE antes de que se escriba en la siguiente fase.
En el caso de una operación de reducción, la salida de Mapper almacenada TEMPORALMENTE se ordena, se baraja según las necesidades del particionador antes de moverse a la operación de reducción
En el caso de Map Only Job, como en su caso, la salida de Mapper almacenada temporalmente se ordena según la clave y se escribe en la carpeta de salida final (como se especifica en los argumentos para el trabajo).
Encabezado ## ¿Hay alguna manera de recopilar los datos de la fase de clasificación y reproducción aleatoria y persistir antes de ir a Reducer? Un reductor se presenta con una clave y una lista de iterables. ¿Hay alguna manera, podría persistir esta información?
No estoy seguro de cuál es tu requisito. usar un IdentityReducer solo persistiría en la salida. No estoy seguro si esto responde su pregunta.
Punto 1: la salida del asignador siempre se ordena, pero se basa en la clave. es decir, si el método Map está haciendo esto: context.write(outKey, outValue);
luego el resultado se ordenará en función de outKey
.
Apoyo la respuesta de vefthym. Por lo general, la salida de Mapper se ordena antes de almacenarla localmente en el nodo. Pero cuando configura explícitamente numReduceTasks en 0 en la configuración del trabajo, el asignador o / p no se ordenará ni escribirá directamente en HDFS. ¡Entonces no podemos decir que la salida de Mapper siempre está ordenada!
¿La salida del mapeador siempre está ordenada?
No. No está clasificado si no usas ningún reductor. Si usa un reductor, hay un proceso de clasificación previa antes de que la salida del mapeador se escriba en el disco. Los datos se ordenan en la fase Reducir. Lo que está sucediendo aquí (solo una suposición) es que no está especificando una clase Reducer, que, en la nueva API, se traduce usando el Reductor de Identidad (vea esta respuesta y comentario). El Reductor de Identidad simplemente genera su entrada. Para verificar eso, vea los contadores de Reductor predeterminados (debe haber algunas tareas de reducción, reducir los registros de entrada y grupos, reducir los registros de salida ...)
¿Ya se ha integrado la fase de clasificación en la fase del mapeador, de modo que la salida de la fase del mapa ya está ordenada en los datos intermedios?
Como expliqué en la pregunta anterior, si no usa reductores, el asignador no ordena los datos. Si usa reductores, los datos comienzan a ordenarse a partir de la fase del mapa y luego se clasifican por fusión en la fase de reducción.
¿Hay alguna manera de recopilar los datos de la fase de clasificación y reproducción aleatoria y persistir antes de que se aplique Reducer? Un reductor se presenta con una clave y una lista de iterables. ¿Hay alguna manera, podría persistir esta información?
De nuevo, mezclar y ordenar son partes de la fase Reducir. Un Reductor de identidad hará lo que quieras. Si desea generar un par clave-valor por reductor, con los valores como una concatenación de los iterables, simplemente almacene los iterables en la memoria (por ejemplo, en un StringBuffer) y luego envíe esta concatenación como un valor. Si desea que la salida del mapa vaya directamente a la salida del programa, sin pasar por una fase de reducción, configure en la clase de controlador el número de tareas de reducción a cero, así:
job.setNumReduceTasks(0);
Sin embargo, esto no obtendrá su salida ordenada. Se omitirá el proceso de ordenamiento previo del asignador y escribirá el resultado directamente en HDFS.
1. ¿La salida del mapeador siempre está ordenada?
2. ¿Ya se ha integrado la fase de clasificación en la fase del mapeador, de modo que la salida de la fase del mapa ya está ordenada en los datos intermedios?
De Apache MapReduceTutorial :
(En la sección de Mapper
)
Todos los valores intermedios asociados con una clave de salida dada se agrupan posteriormente por el marco, y se pasan a los reductores para determinar el resultado final.
Las salidas de Mapper se ordenan y luego se dividen por Reducer . El número total de particiones es el mismo que el número de tareas de reducción para el trabajo
(En la sección del Reducer
)
Reductor NONE
Es legal establecer el número de tareas de reducción en cero si no se desea ninguna reducción.
En este caso, las salidas de las tareas del mapa van directamente al FileSystem, a la ruta de salida establecida por FileOutputFormat.setOutputPath (Job, Path). El marco no ordena las salidas del mapa antes de escribirlas en FileSystem.
3. ¿Hay alguna forma de recopilar los datos de la fase de clasificación y reproducción aleatoria y persistir antes de que se aplique Reducer? Un reductor se presenta con una clave y una lista de iterables. ¿Hay alguna manera, podría persistir esta información?
No lo creo. De la condena de Apache en Reducer :
Reducer tiene 3 fases principales:
Barajar:
The Reducer copia la salida ordenada de cada asignador utilizando HTTP en toda la red.
Ordenar: La combinación de marcos ordena entradas de Reductor por claves (ya que diferentes Mappers pueden haber emitido la misma clave).
Las fases de mezcla y ordenamiento se producen simultáneamente, es decir, mientras se obtienen los resultados, se fusionan.
Reducir:
El resultado de la tarea de reducción se escribe normalmente en un RecordWriter
través de TaskInputOutputContext.write(Object, Object)
.
La salida del Reducer no se vuelve a ordenar.
De acuerdo con la documentación, la fase de mezcla y ordenación es impulsada por el marco
Si desea conservar los datos, configure el número de reductores en Cero, lo que provoca la persistencia de la salida del Mapa en HDFS, pero no ordenará los datos.
Eche un vistazo a la pregunta SE relacionada:
hadoop: diferencia entre 0 reductor y reductor de identidad?
No encontré IdentityReducer en la versión Hadoop 2.x: