2012-07-31 11 views
6

Soy nuevo en hadoop aquí. No está claro por qué necesitamos poder ordenar por claves mientras usamos hadoop mapreduce? Después de la fase del mapa, necesitamos distribuir los datos correspondientes a cada clave única a un cierto número de reductores. Esto se puede hacer sin tener la necesidad de ordenarlo ¿verdad?¿Dónde se utiliza Sort en la fase MapReduce y por qué?

Respuesta

14

Está ahí, porque ordenar es un buen truco para agrupar las llaves. Por supuesto, si su trabajo o algoritmo no necesita ningún orden de sus claves, entonces será más rápido agrupar mediante algún truco de hashing.

En el mismo Hadoop, ya existe una JIRA presentada desde hace años (source). Varias otras distribuciones que se superponen a Hadoop ya tienen estas características, Hanborq por ejemplo (lo llaman sort evidance). (source)

A su pregunta real (por qué), MapReduce era inherentemente un documento de Google (source), que establece lo siguiente:

te garantizamos que dentro de una partición dada, el intermedio clave/valor los pares se procesan en orden de clave creciente. Esto garantiza el orden hace que sea fácil de generar un archivo de salida ordenados por partición, que es útil cuando el formato de archivo de salida tiene que apoyar al azar búsquedas acceso eficiente por la clave o usuarios de la salida encuentran conveniente tiene los datos ordenados

Por lo tanto, fue más una decisión conveniente para admitir la ordenación, pero no para permitir intrínsecamente solo ordenar las teclas de grupo.

+0

Gracias Matt por la edición de las fuentes. –

+0

Gracias Thomas! ¡Eso lo explica! – user428900

+0

En mi opinión, hadoop comienza la clasificación inicial en la salida del mapa que se derramó en el disco (la clasificación ocurre justo antes de mover los registros al derrame) posteriormente fusiona la ordenación (relativamente menos costo) y desde el principio las claves se ordenan. Los combinadores que se invocan y las claves clasificadas también ayudan a invocar el reductor, por lo que la clasificación es una buena idea. – Kalai

1

La "clasificación por clave" se comprende mejor si tenemos en cuenta el hecho de que hadoop DISTRIBUTES procesa para usted mediante el envío de claves diferentes a diferentes máquinas. El (simplificado) versión básica de la idea es la siguiente:

The reducer which a (k,v) pair is sent to = k.hashCode()%num_of_machines. 

lo tanto, si mi código hash de clave es 10, y tengo 2 máquinas, la clave será enviada a la máquina # 0, por ejemplo.

Por lo tanto, la clave (en primer lugar) nos brinda una forma simple de distribuir el cálculo.

Además de simplificar la distribución de los cálculos, las claves nos brindan la posibilidad de unir registros de archivos de datos dispares en un único clúster. Así es como podemos hacer cosas como word_count, por ejemplo.

De hecho, si descubre que no necesita llaves --- ¡probablemente tampoco necesite hadoop!

El ejemplo clásico (recuento de palabras):

En el hadoop "recuento de palabras" ejemplo, emitimos llaves (una clave = una palabra) con valores (# veces esa palabra fue visto en un segmento de texto). Esto permite que una función SINGLE reduce reciba una palabra SIMPLE y, por lo tanto, agregue todas las veces que se vio, creando un conteo de palabras preciso.

Por lo tanto, la agregación de claves es lo que permite que la fase de "mapa" se distribuya en varias máquinas de forma independiente.Sin agregar claves para el mismo reductor, en el ejemplo del conteo de palabras, podríamos obtener varios conteos de palabras para una palabra dada, ya que no hay garantía de que un único reductor reciba todos los recuentos de palabras de todos los archivos.

Otro ejemplo:

Ahora ... digamos que tenemos un número de seguridad social como las identificaciones y queremos dar salida a una agregación de datos personales. Digamos que tenemos 2 archivos masivos.

ssn-> nombre de

ssn-> shoe_size

En este caso, podemos aprovechar el poder de agrupación clave, de manera que un nombre de individuos y el tamaño del zapato se envían tanto a la función de reducir MISMO.

El reductor (2) recibirá 2 registros aquí:

ssn-> nombre, shoe_size

La idea aquí es que al escribir map/reduce puestos de trabajo, usted tiene que codificar sus "tuplas" que se emiten de tal manera que se pueden unir de manera significativa, en la fase de reducción. Cualquier entorno informático distribuido probablemente necesite, en algún momento, combinar registros calculados en diferentes nodos. Las claves nos brindan una metodología conveniente y escalable para hacer esto.

Entonces, el hecho de que se garantice que las MISMAS teclas vayan a la MISMA función reductora confirma que CADA reductor para este número de seguridad social en particular recibirá TODOS los datos asociados con ese número, permitiéndonos unir y generar registros de datos que incluyen ssn, nombre y tamaño del zapato.

Conclusión

sin distribuir por la llave, uniéndose a los datos de tal manera que requeriría la lógica dolorosamente complejo que implica algún tipo de intermediario de almacenamiento de datos/almacenamiento en caché. Hadoop simplemente generaliza y abstrae la necesidad común de "unir" los resultados de datos de cómputos paralelos mediante el uso de un paradigma familiar: claves y valores.

Cuestiones relacionadas