2016-04-03 6 views
0

Eine Scala-Funktion wird an rdd.map() übergeben. Die Logik ist zu komplex, um in der Funktion selbst enthalten zu sein, und stattdessen ist die Logik in einer Skala object eingekapselt. Das Objekt ist Teil der Anwendung, die den Funken Kontext instanziiert, wie im folgenden Beispiel:Client-seitiger Paketcode zum Übergeben an eine RDD

def func(s.String) = { 
    // LogicEngine is object which, given a string, returns a different string 
    LogicEngine.process(s) 
} 

val sc = new SparkContext(config) 

val rdd = sc.textFile(“…”) 

val rdd2 = rdd.map(func) 

Die Frage ist, was ist der richtige Weg, dies zu tun, damit sich an den Knoten, auf denen übergeben wird die rdd selbst wird verarbeitet (so dass es zusammen mit dem an die rdd übergebenen Funktionscode lebt), anstatt auf dem Client zu sitzen?

Dank

Antwort

1

Das ist, was Sie bereits haben. Jeder Knoten wird beim ersten Zugriff eine eigene Kopie von instanziieren und verwenden.

+0

Danke. Noch einen Schritt weiter: Wenn LogicEngine eine interne, statische Lookup-Liste verwendet, wird diese vermutlich zusammen mit dem Code an den Knoten übergeben. Aber was ist, wenn LogicEngine eine dynamische Liste verwendet, die wächst, wenn RDDs verarbeitet werden. Wird jeder Knoten den Cache nur in dem Zustand sehen, in dem er war, als er zum ersten Mal an die rdd übergeben wurde? – user1052610

+0

Siehe https://spark.apache.org/docs/latest/programming-guide.html#shared-variables. –

+0

Nur um zu verdeutlichen, dass mein Verständnis richtig ist - um eine globale Variable - in diesem Fall einen Cache - zu implementieren, die dynamisch (von den Knoten selbst) aktualisiert und über alle Knoten verteilt wird, sollten wir einen Akkumulator verwenden. – user1052610

Verwandte Themen