Buoni esempi MapReduce [chiuso]


202

Non riuscivo a pensare ad altri buoni esempi oltre all'attività "come contare le parole in un lungo testo con MapReduce". Ho scoperto che questo non è stato l'esempio migliore per dare agli altri un'idea di quanto potente possa essere questo strumento.

Non sto cercando frammenti di codice, in realtà solo esempi "testuali".


1
Penso che un esempio simile ma molto migliore sia contare le parole per tutti i tuoi file di testo che hai sul tuo computer. È più facile da capire e dimostra la potenza di MapReduce.
Peter Lee,

5
Alle ultime quattro domande che ho cercato, le ho trovate chiuse come non costruttive su questo sito. Per fortuna hanno già delle risposte. Per gli autori approvo la mia gratitudine e, ad oggi, c'erano più di 80 persone che non capiscono la politica di chiusura. Non è importante per gli altri, ma sono un programmatore professionista dall'inizio degli anni '80 e, ormai, mi sono ritrovato a porre le domande sbagliate :)
Helder Velez,

1
Vale la pena dare un'occhiata ai modelli di design di MapReduce: ad esempio alcuni illustrati in queste diapositive e altri possono essere visti in questo libro
Denis,

Risposte:


297

La riduzione delle mappe è un framework sviluppato per elaborare in modo efficiente enormi quantità di dati. Ad esempio, se abbiamo 1 milione di record in un set di dati ed è archiviato in una rappresentazione relazionale, è molto costoso ricavare valori ed eseguire qualsiasi tipo di trasformazione su di essi.

Ad esempio, in SQL, data la data di nascita, scoprire quante persone hanno un'età> 30 per un milione di record richiederebbe un po 'di tempo, e questo aumenterebbe solo in ordine di grandezza quando aumenta la complessità della query. Map Reduce fornisce un'implementazione basata su cluster in cui i dati vengono elaborati in modo distribuito

Ecco un articolo di Wikipedia che spiega di cosa map-reducesi tratta

Un altro buon esempio è Trovare amici tramite la riduzione della mappa può essere un potente esempio per comprendere il concetto e un caso d'uso ben utilizzato.

Personalmente, ho trovato questo link abbastanza utile per capire il concetto

Copia della spiegazione fornita nel blog (nel caso in cui il link non sia aggiornato)

Alla ricerca di amici

MapReduce è un framework originariamente sviluppato da Google che consente un facile calcolo distribuito su larga scala in numerosi domini. Apache Hadoop è un'implementazione open source.

Esaminerò i dettagli, ma si tratta di definire due funzioni: una funzione di mappa e una funzione di riduzione. La funzione mappa accetta un valore e genera chiave: coppie di valori. Ad esempio, se definiamo una funzione della mappa che accetta una stringa e genera la lunghezza della parola come chiave e la parola stessa come valore, allora map (steve) restituisce 5: steve e map (savannah) restituiscono 8: savannah . Potresti aver notato che la funzione mappa è senza stato e richiede solo il valore di input per calcolare il valore di output. Questo ci consente di eseguire la funzione della mappa su valori in parallelo e offre un enorme vantaggio. Prima di arrivare alla funzione di riduzione, il framework mapreduce raggruppa tutti i valori per chiave, quindi se le funzioni della mappa producono la seguente chiave: coppie di valori:

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

Vengono raggruppati come:

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

Ognuna di queste righe verrebbe quindi passata come argomento alla funzione di riduzione, che accetta una chiave e un elenco di valori. In questo caso, potremmo provare a capire quante parole di determinate lunghezze esistono, quindi la nostra funzione di riduzione conterà semplicemente il numero di elementi nell'elenco e produrrà la chiave con le dimensioni dell'elenco, come:

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

Le riduzioni possono anche essere fatte in parallelo, fornendo di nuovo un enorme vantaggio. Possiamo quindi guardare questi risultati finali e vedere che c'erano solo due parole di lunghezza 5 nel nostro corpus, ecc ...

L'esempio più comune di mapreduce è per contare il numero di volte in cui le parole si verificano in un corpus. Supponiamo che tu abbia una copia di Internet (sono stato abbastanza fortunato da aver lavorato in una situazione del genere) e che tu volessi un elenco di ogni parola su Internet e quante volte si è verificato.

Il modo in cui ti approcceresti sarebbe tokenizzare i documenti che hai (spezzarli in parole) e passare ogni parola a un mappatore. Il mappatore quindi sputerebbe indietro la parola con un valore di 1. La fase di raggruppamento prenderà tutti i tasti (in questo caso parole) e farà un elenco di 1. La fase di riduzione prende quindi una chiave (la parola) e un elenco (un elenco di 1 per ogni volta che la chiave appare su Internet) e somma l'elenco. Il riduttore quindi emette la parola, insieme al conteggio. Quando tutto è detto e fatto avrai un elenco di ogni parola su Internet, insieme a quante volte è apparso.

Facile vero? Se hai mai letto su mapreduce, lo scenario sopra riportato non è una novità ... è il "Ciao, mondo" di mapreduce. Quindi, ecco un caso d'uso reale (Facebook può o non può effettivamente fare quanto segue, è solo un esempio):

Facebook ha un elenco di amici (nota che gli amici sono una cosa bidirezionale su Facebook. Se sono tuo amico, sei mio). Hanno anche molto spazio su disco e servono centinaia di milioni di richieste ogni giorno. Hanno deciso di pre-calcolare i calcoli quando possono ridurre i tempi di elaborazione delle richieste. Una richiesta di elaborazione comune è la funzione "Tu e Joe avete 230 amici in comune". Quando visiti il ​​profilo di qualcuno, vedi un elenco di amici che hai in comune. Questo elenco non cambia frequentemente, quindi sarebbe inutile ricalcolarlo ogni volta che si visita il profilo (sicuro che si potrebbe utilizzare una strategia di cache decente, ma non sarei in grado di continuare a scrivere su mapreduce per questo problema). Utilizzeremo mapreduce in modo da poter calcolare tutti " s amici comuni una volta al giorno e memorizza questi risultati. Più tardi è solo una rapida ricerca. Abbiamo un sacco di dischi, è economico.

Supponiamo che gli amici siano memorizzati come Persona -> [Elenco di amici], quindi il nostro elenco di amici è:

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

Ogni riga sarà un argomento per un mapper. Per ogni amico nell'elenco di amici, il mapper produrrà una coppia chiave-valore. La chiave sarà un amico insieme alla persona. Il valore sarà l'elenco di amici. La chiave verrà ordinata in modo che gli amici siano in ordine, facendo sì che tutte le coppie di amici vadano allo stesso riduttore. Questo è difficile da spiegare con il testo, quindi facciamolo e vediamo se riesci a vedere lo schema. Dopo aver eseguito tutti i mapper, avrai un elenco come questo:

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)

Ogni riga verrà passata come argomento a un riduttore. La funzione di riduzione interseca semplicemente gli elenchi di valori e genera la stessa chiave con il risultato dell'intersezione. Ad esempio, ridurre ((AB) -> (ACDE) (BCD)) produrrà (AB): (CD) e significa che gli amici A e B hanno C e D come amici comuni.

Il risultato dopo la riduzione è:

(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)

Ora quando D visita il profilo di B, possiamo rapidamente cercare (B D)e vedere che hanno tre amici in comune (A C E).


4
Un altro esempio potrebbe essere l'analisi dei dati meteorologici da tutto il mondo. Trovare il massimo e il minimo per una determinata regione. Questo è un ottimo esempio.
rvphx,

Generare tutte quelle tuple intermedie e poi controllare per sempre l'intersezione, non è noioso? Non sarebbe meglio generare tutte le possibili coppie di amici, come AB AC BC, ecc. E passare queste coppie con l'intera lista di amici, solo dei due amici nella coppia, a una macchina particolare e lasciare che calcoli l'intersezione? Cosa mi sto perdendo qui?
GrowinMan,

8
Cosa succede se A visita il profilo di E? Non c'è (A, E) nel risultato finale sebbene abbiano amici in comune.
Pizzica il

1
@Pinch è perché A ed E non sono amici stessi. In tal caso questo approccio sembra davvero insufficiente (a meno che non si tenga conto del fatto che A o E potrebbero nascondere la loro
lista di

1
@karthikr: sono confuso riguardo alla fase di raggruppamento. Map and Reduce può ovviamente essere eseguito in parallelo, ma per quanto riguarda la fase di raggruppamento? Deve essere fatto in un singolo thread o mi sto perdendo qualcosa?
Dinaiz,


4

Un insieme di operazioni familiari che è possibile eseguire in MapReduce è l'insieme delle normali operazioni SQL: SELEZIONA, SELEZIONA DOVE, Raggruppa per, ecc.

Un altro buon esempio è la matrice moltiplicata, in cui si passa una riga di M e l'intero vettore x e si calcola un elemento di M * x.


3

Di tanto in tanto presento i concetti di RM alle persone. Trovo che le attività di elaborazione siano familiari alle persone e quindi le associo al paradigma MR.

Di solito prendo due cose:

  1. Raggruppa per / aggregazioni. Qui il vantaggio della fase di mescolamento è evidente. Una spiegazione secondo cui lo shuffle è anche distribuito sort + una spiegazione dell'algoritmo di ordinamento distribuito aiuta.

  2. Unisci due tavoli. Le persone che lavorano con DB hanno familiarità con il concetto e il suo problema di scalabilità. Mostra come può essere fatto in MR.


per spiegare ai non nerd uso il metodo children: hai un sacco di bambini desiderosi e molte molte carte. dai ad ogni bambino un numero di carte che gli dice di ordinarle per mazzo di carte * sul retro, quindi per numero / immagine, quindi per seme, ovvero la funzione mappa che ogni bambino termina e porta a un gruppo di adulti assegnato, due alla volta. ogni adulto "riduce" la pila in una pila, e poi ogni due adulti danno a un adulto libero le pile di carte. questa è per definizione la funzione di riduzione che può essere eseguita più di una volta in base al numero di bambini / pile. la maggior parte delle persone lo
capisce
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.