2015-08-29 24 views
7

Potete vedere l'attuazione qui: https://github.com/apache/spark/blob/ffa05c84fe75663fc33f3d954d1cb1e084ab3280/python/pyspark/rdd.py#L804Understanding treeReduce() in Spark

Come lo fa diverso dal 'normale' la funzione reduce?
Che cosa significa depth = 2?

Non voglio che la funzione di riduttore passi linearmente sulle partizioni, ma riduca prima ciascuna coppia disponibile, e quindi itererà in quel modo finché non ne avrò una sola coppia e la ridurrò a 1, come mostrato nel immagine:

enter image description here

Ha treeReduce raggiungere questo?

risposta

5

Standard reduce sta assumendo una versione della funzione spostata e utilizzando mapPartitions. Dopo che i risultati sono stati raccolti e reduced locally su un driver. Se il numero delle partizioni è grande e/o la funzione che si utilizza è costosa, pone un carico significativo su una singola macchina.

La prima fase di treeReduce è praticamente la stessa di sopra ma dopo i risultati parziali vengono uniti in parallelo e solo l'aggregazione finale viene eseguita sul driver.

depth è suggested depth of the tree e poiché la profondità del nodo di albero è definito come numero di bordi tra la radice e il nodo occorre voi dare più o meno un modello previsto anche se sembra un'aggregazione can be stopped early distribuito in alcuni casi.

Vale la pena notare che ciò che si ottiene con treeReduce non è un albero binario. Il numero delle partizioni viene regolato su ciascun livello e molto probabilmente più di due partizioni verranno unite contemporaneamente.

Rispetto alla riduzione standard, versione ad albero performs reduceByKey with each iteration e significa un sacco di dati mescolati. Se il numero delle partizioni è relativamente piccolo, sarà molto più economico utilizzare lo standard reduce. Se si sospetta che la fase finale di reduce sia un collo di bottiglia, la versione tree* potrebbe valere la pena di provarla.

+0

Come posso implementare qualcosa come nella mia foto? – member555

+0

Se la tua immagine rappresenta le partizioni, allora per quanto posso dire i metodi di 'tree *' sono la scelta giusta. – zero323

+1

sì, ogni blocco è una partizione. dovrei scegliere la profondità = 2? Poiché la profondità complessiva è log (num_partitions) – member555