2015-06-25 21 views
7

Ich bin gespannt, was genau eine RDD an eine Funktion in Spark übergeben.Spark/Scala: RDD zu Funktion übergeben

def my_func(x : RDD[String]) : RDD[String] = { 
    do_something_here 
} 

Angenommen, wir definieren eine Funktion wie oben. Wenn wir die Funktion aufrufen und ein vorhandenes RDD [String] -Objekt als Eingabeparameter übergeben, macht diese my_function eine Kopie für diese RDD als Funktionsparameter? Mit anderen Worten: Wird es per Referenz oder Wert-by-Wert aufgerufen?

Antwort

12

In Scala wird nichts kopiert (im Sinne von "pass-by-value" in C/C++), wenn es weitergegeben wird. Die meisten Basistypen Int, String, Double usw. sind unveränderlich, daher ist es sehr sicher, sie als Referenz zu übergeben. (Hinweis: Wenn Sie ein veränderbares Objekt übergeben und Sie es ändern, wird jeder mit einer Referenz auf dieses Objekt die Änderung sehen).

Darüber hinaus sind RDDs faule, verteilte, unveränderbare Sammlungen. Das Weitergeben von RDDs über Funktionen und das Anwenden von transformation auf sie (Map, Filter usw.) überträgt keine Daten oder löst keine Berechnungen aus.

Alle verketteten Transformationen „erinnert“ werden und wird automatisch in der richtigen Reihenfolge ausgelöst werden, wenn Sie erzwingen und action auf der RDD, wie persistierende es, oder es lokal an den Fahrer zu sammeln (durch collect(), take(n), etc.)

4

Spark implementiert das Prinzip "senden Sie den Code an Daten" anstatt die Daten an den Code zu senden. Hier wird es genau umgekehrt passieren. Es ist die Funktion, die an die RDDs verteilt und gesendet wird.

RDDs sind unveränderbar, daher wird entweder Ihre Funktion eine neue RDD als Ergebnis (Transformation) erstellen oder einen Wert (Aktion) erstellen.

Die interessante Frage hier ist, wenn Sie eine Funktion definieren, was genau wird an die RDD gesendet (und verteilt auf verschiedene Knoten, mit seinen Transferkosten)? Eine schöne Erklärung hier:

http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark

Verwandte Themen