2012-04-19 12 views
16

un combinatore viene eseguito dopo il Mapper e prima del riduttore, riceverà come input i dati emessi dai istanze Mapper su un dato nodo. Poi emette in uscita ai riduttori.Classe “Combiner" in un lavoro MapReduce

e inoltre, se una funzione di ridurre sia commutativa e associativa, allora può essere utilizzato come un combinatore.

la mia domanda è che cosa fa la frase "commutativa e associativa" significa in questa situazione ?

risposta

26

si supponga di avere una lista di numeri, 1 2 3 4 5 6.

associativo qui significa che si può prendere il vostro funzionamento e applicarlo a qualsiasi sottogruppo, quindi applicare al risultato di quelli e di ottenere il stessa risposta:

(1) + (2 + 3) + (4 + 5 + 6) 
    == 
(1 + 2) + (3 + 4) + (5) + (6) 
    == 
... 

Pensa alla parentesi qui come all'esecuzione di un combinatore.

commutativa significa che l'ordine non importa, così:

1 + 2 + 3 + 4 + 5 + 6 
    == 
2 + 4 + 6 + 1 + 2 + 3 
    == 
... 

Ad esempio, inoltre, si inserisce questa proprietà, come visto in precedenza. "Massimo" si adatta anche a questa proprietà, poiché il numero massimo di max è il massimo. max (a, b) == max (b, a).

Median è un esempio che non funziona: la mediana delle mediane non è la vera mediana.


Non dimenticare un'altra importante proprietà di un combinatore: i tipi di ingresso per la chiave/valore ei tipi di uscita della chiave/valore devono essere gli stessi. Ad esempio, non puoi prendere una stringa: int e restituire una stringa: float.

Spesso il riduttore potrebbe emettere una sorta di stringa anziché un valore numerico, il che potrebbe impedire di collegare semplicemente il riduttore come combinatore.

+0

Qualcuno può azzardarsi a indovinare il motivo del voto negativo? Mi piacerebbe davvero sapere se la mia risposta non è buona per qualche motivo, dato che questo è il modo in cui spiego sempre i combinatori alle persone. Grazie! –

+0

la tua risposta è di grande aiuto, grazie –

+0

Ottima risposta. Grazie! –

10

Per la commutatività, diciamo che il riduttore può essere rappresentato da una funzione (nel termine matematico) chiamata f(). Allora la vostra riduttore è commutativo se f (a, b) = f (b, a) Ad esempio:

  • somma (A, B) è la stessa somma (B, A)
  • xor (A, B) è uguale xor (B, A)
  • concat (A, B) è non uguale concat (B, A)

Per associativa, la struttura è che f (f (a, b), c) = f (a, f (b, c)). Ad esempio:

  • (A + B) + C è uguale a A + (B + C)
  • (A - B) - C è non uguale A - (B - C

Pertanto, nel contesto di Mappa/Riduzione, il riduttore deve rispettare queste 2 proprietà. Ad esempio, se il tuo riduttore fa solo un sum() o un massimo(), rispetta entrambe le proprietà, ma qualcosa come mean() o median() non lo fa, e quindi non puoi usarlo come un combinatore.

io personalmente vedere combinatori come mini-riduttori che vengono eseguiti in memoria dopo la fase di mappa come un'ottimizzazione per ridurre il traffico di rete, e la proprietà commutativa/associatività in realtà ha un senso se si vede un Map/Reduce questo modo:

enter image description here

Problemi correlati