Buenos ejemplos de MapReduce [cerrado]


202

No pude pensar en ningún buen ejemplo que no sea la tarea "cómo contar palabras en un texto largo con MapReduce". Descubrí que este no era el mejor ejemplo para dar a los demás una impresión de lo poderosa que puede ser esta herramienta.

No estoy buscando fragmentos de código, realmente solo ejemplos "textuales".


1
Creo que un ejemplo similar pero mucho mejor es contar palabras para todos los archivos de texto que tiene en su computadora. Es más fácil de entender y demuestra el poder de MapReduce.
Peter Lee

55
En las últimas cuatro preguntas que busqué, las encontré cerradas como no constructivas en este sitio. Por fortuna ya tienen respuestas. A los autores les doy mi agradecimiento y, hasta ahora, había más de 80 personas que no entienden la política de cierre. No es que le importe a otros, pero soy un programador profesional desde el comienzo de los años 80 y, a estas alturas, me encontré haciendo las preguntas equivocadas :)
Helder Velez

1
Vale la pena echar un vistazo a los patrones de diseño de MapReduce: por ejemplo, algunos cubiertos en estas diapositivas y más se pueden ver en este libro
Denis

Respuestas:


297

Map reduce es un marco desarrollado para procesar cantidades masivas de datos de manera eficiente. Por ejemplo, si tenemos 1 millón de registros en un conjunto de datos, y está almacenado en una representación relacional, es muy costoso derivar valores y realizar cualquier tipo de transformación en estos.

Por ejemplo, en SQL, dada la fecha de nacimiento, averiguar cuántas personas tienen> 30 años por un millón de registros llevaría un tiempo, y esto solo aumentaría en orden de aumento cuando aumente la complejidad de la consulta. Map Reduce proporciona una implementación basada en clúster donde los datos se procesan de manera distribuida

Aquí hay un artículo de Wikipedia que explica de qué map-reducese trata

Otro buen ejemplo es Finding Friends via map reduce puede ser un ejemplo poderoso para entender el concepto y un caso de uso bien utilizado.

Personalmente, este enlace me pareció bastante útil para entender el concepto

Copiar la explicación proporcionada en el blog (en caso de que el enlace se vuelva obsoleto)

Encontrar amigos

MapReduce es un marco desarrollado originalmente en Google que permite una computación distribuida fácil a gran escala en varios dominios. Apache Hadoop es una implementación de código abierto.

Voy a pasar por alto los detalles, pero se trata de definir dos funciones: una función de mapa y una función de reducción. La función de mapa toma un valor y genera la clave: pares de valores. Por ejemplo, si definimos una función de mapa que toma una cadena y genera la longitud de la palabra como la clave y la palabra misma como el valor, map (steve) devolvería 5: steve y map (savannah) devolvería 8: savannah . Es posible que haya notado que la función de mapa no tiene estado y solo requiere el valor de entrada para calcular su valor de salida. Esto nos permite ejecutar la función de mapa contra valores en paralelo y proporciona una gran ventaja. Antes de llegar a la función de reducción, el marco mapreduce agrupa todos los valores por clave, por lo que si las funciones de mapa generan la siguiente clave: pares de valores:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

Se agrupan como:

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

Cada una de estas líneas se pasaría como un argumento a la función reducir, que acepta una clave y una lista de valores. En este caso, podríamos estar tratando de averiguar cuántas palabras existen de ciertas longitudes, por lo que nuestra función de reducción solo contará el número de elementos en la lista y generará la clave con el tamaño de la lista, como:

3 : 3
4 : 3
5 : 2
8 : 2

Las reducciones también se pueden hacer en paralelo, lo que nuevamente ofrece una gran ventaja. Luego podemos ver estos resultados finales y ver que solo había dos palabras de longitud 5 en nuestro corpus, etc.

El ejemplo más común de mapreduce es contar el número de veces que las palabras aparecen en un corpus. Suponga que tiene una copia de Internet (he tenido la suerte de haber trabajado en una situación así) y quería una lista de todas las palabras en Internet, así como cuántas veces ocurrió.

La forma en que abordaría esto sería tokenizar los documentos que tiene (dividirlos en palabras) y pasar cada palabra a un mapeador. El mapeador entonces escupiría la palabra junto con un valor de 1. La fase de agrupación tomará todas las claves (en este caso, palabras) y hará una lista de 1. La fase de reducción toma una clave (la palabra) y una lista (una lista de 1 por cada vez que aparece la clave en Internet), y suma la lista. El reductor luego genera la palabra, junto con su recuento. Cuando todo esté dicho y hecho, tendrá una lista de cada palabra en Internet, junto con cuántas veces apareció.

Fácil, verdad? Si alguna vez has leído sobre mapreduce, el escenario anterior no es nada nuevo ... es el "Hola, Mundo" de mapreduce. Así que aquí hay un caso de uso del mundo real (Facebook puede o no hacer lo siguiente, es solo un ejemplo):

Facebook tiene una lista de amigos (tenga en cuenta que los amigos son algo bidireccional en Facebook. Si soy su amigo, usted es mío). También tienen mucho espacio en disco y atienden cientos de millones de solicitudes todos los días. Han decidido calcular previamente los cálculos cuando pueden para reducir el tiempo de procesamiento de las solicitudes. Una solicitud de procesamiento común es la función "Usted y Joe tienen 230 amigos en común". Cuando visitas el perfil de alguien, ves una lista de amigos que tienes en común. Esta lista no cambia con frecuencia, por lo que sería un desperdicio volver a calcularla cada vez que visitara el perfil (seguro de que podría usar una estrategia de almacenamiento en caché decente, pero entonces no podría seguir escribiendo sobre mapreduce para este problema). Vamos a utilizar mapreduce para poder calcular a todos ' s amigos comunes una vez al día y almacenar esos resultados. Más tarde es solo una búsqueda rápida. Tenemos muchos discos, es barato.

Supongamos que los amigos se almacenan como Persona -> [Lista de amigos], nuestra lista de amigos es entonces:

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

Cada línea será un argumento para un mapeador. Para cada amigo en la lista de amigos, el asignador generará un par clave-valor. La clave será un amigo junto con la persona. El valor será la lista de amigos. La clave se ordenará para que los amigos estén en orden, haciendo que todos los pares de amigos vayan al mismo reductor. Esto es difícil de explicar con texto, así que hagámoslo y veamos si puedes ver el patrón. Después de que todos los mapeadores hayan terminado de ejecutarse, tendrá una lista como esta:

For map(A -> B C D) :

(A B) -> B C D
(A C) -> B C D
(A D) -> B C D

For map(B -> A C D E) : (Note that A comes before B in the key)

(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :

(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :

(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):

(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:

(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

Cada línea se pasará como argumento a un reductor. La función reducir simplemente intersecará las listas de valores y generará la misma clave con el resultado de la intersección. Por ejemplo, reducir ((AB) -> (ACDE) (BCD)) generará (AB): (CD) y significa que los amigos A y B tienen C y D como amigos comunes.

El resultado después de la reducción es:

(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)

Ahora, cuando D visita el perfil de B, podemos buscar rápidamente (B D)y ver que tienen tres amigos en común (A C E),.


44
Otro ejemplo sería analizar los datos meteorológicos de todo el mundo. Encontrar el máximo y el mínimo para cualquier región dada. Este es un muy buen ejemplo.
rvphx

Generar todas esas tuplas intermedias y luego verificar la intersección para todo, ¿no es tedioso? ¿No sería mejor generar todos los pares de amigos posibles, como AB AC BC, etc. y simplemente pasar estos pares con las listas de amigos completas, solo de los dos amigos en el par, a una máquina en particular y dejar que calcule la intersección? ¿Que me estoy perdiendo aqui?
GrowinMan

8
¿Qué pasa si el perfil de una visita E? No hay (A, E) en el resultado final, aunque tienen amigos en común.
Pinch

1
@Pinch es porque A y E no son amigos en sí mismos. En ese caso, este enfoque parece realmente insuficiente (a menos que tenga en cuenta que A o E podrían ocultar su lista de amigos para los que no son amigos :))
Pega88

1
@karthikr: Estoy confundido acerca de la fase de agrupación. Map and Reduce obviamente se puede ejecutar en paralelo, pero ¿qué pasa con la fase de agrupación? Debe hacerse en un solo hilo o me falta algo?
Dinaiz


4

Un conjunto de operaciones familiares que puede hacer en MapReduce es el conjunto de operaciones SQL normales: SELECCIONAR, SELECCIONAR DÓNDE, GRUPO POR, ect.

Otro buen ejemplo es la multiplicación de matrices, donde se pasa una fila de M y todo el vector x y se calcula un elemento de M * x.


3

De vez en cuando presento conceptos de MR a las personas. Encuentro tareas de procesamiento familiares para las personas y luego las asigno al paradigma MR.

Por lo general, tomo dos cosas:

  1. Agrupar por / Agregaciones. Aquí la ventaja de la etapa de barajar es clara. Una explicación de que la barajadura también se distribuye ordenada + una explicación del algoritmo de ordenación distribuida también ayuda.

  2. Unión de dos mesas. Las personas que trabajan con DB están familiarizadas con el concepto y su problema de escalabilidad. Mostrar cómo se puede hacer en MR.


Para explicar a los no nerds, uso el método de niños: tienes un montón de niños ansiosos y muchas tarjetas. usted le da a cada niño una cantidad de cartas diciéndoles que las clasifiquen por el reverso de la baraja de cartas *, luego por número / imagen y luego por palo, es decir, la función de mapa que cada niño termina y lleva a un grupo asignado de adultos, dos a la vez. cada adulto "reduce" la pila en una pila, y luego cada dos adultos le dan a un adulto gratis sus montones de cartas. es, por definición, la función de reducción que se puede ejecutar más de una vez de acuerdo con el número de niños / pilas. la mayoría de la gente lo consigue en el primer intento
Mickey Perlstein
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.