2015-07-31 10 views
5

Ich komme aus einem Hadoop-Hintergrund und haben begrenzte Kenntnisse über Spark. Basierend auf dem, was ich bisher gelernt habe, hat Spark keine Mapper/Reducer-Knoten und stattdessen Treiber/Worker-Knoten. Der Arbeiter ist dem Mapper ähnlich und der Fahrer ist (irgendwie) dem Reducer ähnlich. Da es nur ein Treiberprogramm gibt, wird es einen Reduzierer geben. Wenn ja, wie einfach Programme wie die Wortzahl für sehr große Datenmengen im Funke ausgeführt werden können? Weil dem Treiber einfach der Arbeitsspeicher ausgehen kann.Reduzierung Konzept in Spark

+1

@ zero323 hat einen Punkt ... Menschen werden aufhören zu beantworten, wenn Sie nie eine Antwort akzeptieren .... –

Antwort

10

Der Treiber ist mehr ein Controller der Arbeit, nur Daten zurückziehen, wenn der Operator es fordert. Wenn der Operator, an dem Sie gerade arbeiten, einen RDD/DataFrame/Unit zurückgibt, bleiben die Daten verteilt. Wenn es einen nativen Typ zurückgibt, wird es tatsächlich alle Daten zurückziehen.

Sonst ist das Konzept von map und reduce hier ein bisschen obsolet (von einer Art von Arbeit persopective). Die einzige Sache, die wirklich wichtig ist, ist, ob die Operation eine Datenmischung erfordert oder nicht. Sie können die Shuffle-Punkte durch die Stage-Splits entweder in der Benutzeroberfläche oder über einen toDebugString sehen (wobei jede Einrückungsebene ein Shuffle ist).

Alles, was gesagt wird, für ein vages Verständnis, können Sie alles, was einen Shuffle erfordert, zu einem Reducer gleichsetzen. Sonst ist es ein Mapper.

Last, auf dein Wort gleichzusetzen zählt Beispiel:

sc.textFile(path) 
    .flatMap(_.split(" ")) 
    .map((_, 1)) 
    .reduceByKey(_+_) 

In dem obigen, wird dies in einer Stufe als Datenlade (textFile), Splitting (flatMap) und map ping kann alles getan werden, unabhängig von den übrigen Daten durchgeführt werden. Es wird kein Shuffle benötigt, bis der reduceByKey aufgerufen wird, da er alle Daten kombinieren muss, um den Vorgang auszuführen ... HOWEVER, dieser Vorgang muss aus einem bestimmten Grund assoziativ sein. Jeder Knoten führt die in reduceByKey definierte Operation lokal aus und fügt erst den endgültigen Datensatz hinzu. Dies reduziert sowohl den Speicher- als auch den Netzwerk-Overhead.

HINWEIS dass reduceByKey kehrt ein RDD und ist somit ein transformation, so werden die Daten über eine HashPartitioner gemischt. Alle Daten werden NICHT an den Treiber zurückgegeben, sondern nur an Knoten mit denselben Schlüsseln, sodass der endgültige Wert zusammengeführt werden kann.

Nun, wenn Sie einen action wie reduce oder schlimmer noch verwenden, collect, dann werden Sie nicht ein RDD zurück, die die Daten bedeutet für den Fahrer zieht sich zurück und Sie werden es brauchen Raum.

Here is my fuller explanation of reduceByKey if you want more. Oder wie dies in etwas wie combineByKey

zerbricht
+0

Die assoziative Eigenschaft bringt eine Funktionalität wie Combiner in HAdoop. Für den 'reducedByKey' müssen die Daten jedoch gemischt und an einen anderen Arbeiterknoten gesendet werden. Können wir sagen, dass der Arbeiterknoten die Reduziererrolle spielt? –

+0

Also meine mein erstes Verständnis war richtig, denn im Fall der Wortzählung, lassen Sie uns sagen, wir haben 1M einzigartige Wörter. Also werden all diese einzigartigen Wörter (zusammen mit ihrer Teilfrequenz) an den Fahrer übertragen, um reduziert zu werden? Mit anderen Worten, wir können daraus schließen, dass es in Spark einen Minderer gibt, und das ist der Fahrer? Alle diese Reduzierungen werden auch in Hadoop (mit Combiner) durchgeführt. –

+0

Blah, ich habe irgendwie ausgeblendet, dass reduceByKey eine Umwandlung ist .... der Treiber wird NICHT alle Daten in diesem Fall bekommen ... deshalb werden Paarfunktionen gedrückt, wenn Sie eine Schlüssel/Wert-Darstellung haben ...Ich habe meine Antwort aktualisiert, um das zu spezifizieren ... aber ja, die Arbeiter sind die Reduzierer in dieser Rolle. –