2015-09-06 4 views
6

Spark RDDs sind unveränderlich, fehlertolerant und widerstandsfähig konstruiert.Wird es irgendein Szenario geben, in dem Spark RDDs die Unveränderlichkeit nicht erfüllen können?

Erfüllt RDDs die Unveränderlichkeit in allen Szenarien? Oder gibt es einen Fall, sei es in Streaming oder Core, wo RDD die Unveränderlichkeit nicht erfüllen könnte?

+0

Nein, es wird nie versagen! Wenn die zugrunde liegende Infrastruktur unveränderlich ist, wie möchten Sie, dass sie die Unveränderlichkeit nicht erfüllt? – eliasah

+0

Ja, ich stimme zu, dass die Struktur unveränderlich ist. Ich habe nur versucht zu überprüfen, ob es einen Fall gibt. Es ist auch resilient und fehlertolerant, was es erlaubt, Fehler neu zu berechnen. Stellt re-Berechnung auch die Unveränderlichkeit sicher? Denken Sie daran, in streaming Windows arbeiten und erstellen Sie eine dstream, das ist ein Paket von RDDs und implizieren das Scheitern und Neuberechnung, und garantiert es Unveränderlichkeit.? – Srini

Antwort

0

Nehmen Sie dieses Beispiel:

sc.makeRDD(1 to 100000).map(x=>{ 
    println(x) 
    x + 1 
}.collect 

Wenn ein Knoten ausfällt, nachdem der map abgeschlossen ist, aber die vollständigen Ergebnisse sind noch nicht zurück an den Fahrer gesendet werden, dann ist die map wird auf einer anderen Maschine neu zu berechnen. Die Endergebnisse sind immer gleich, da jeder berechnete Wert nur einmal zurückgesendet wird. Die println wird jedoch für einige Anrufe zweimal aufgetreten sein. Also, ja, die Unveränderlichkeit der DAG selbst ist garantiert, aber Sie müssen Ihren Code immer noch mit der Annahme schreiben, dass er mehr als einmal ausgeführt wird.

4

Es hängt davon ab, was Sie meinen, wenn Sie über RDD sprechen. Streng genommen ist nur eine Beschreibung der Abstammung, die nur für den Treiber existiert und keine Methoden bereitstellt, die verwendet werden können, um ihre Abstammung zu verändern.

Wenn Daten verarbeitet werden, können wir nicht mehr über RDDs sprechen, aber dennoch werden Daten mit unveränderlichen Datenstrukturen (scala.collection.Iterator in Scala, itertools.chain in Python) verfügbar gemacht.

So weit so gut. Leider bedeutet die Unveränderbarkeit einer Datenstruktur keine Unveränderlichkeit der gespeicherten Daten. Läßt ein kleines Beispiel erstellen, das zu veranschaulichen:

val rdd = sc.parallelize(Array(0) :: Array(0) :: Array(0) :: Nil) 
rdd.map(a => { a(0) +=1; a.head }).sum 
// Double = 3.0 

Sie können dies so oft ausführen, wie Sie das gleiche Ergebnis wollen und erhalten. Nun läßt cacherdd und wiederholen Sie einen gesamten Prozess:

rdd.cache 
rdd.map(a => { a(0) +=1; a.head }).sum 
// Double = 3.0 
rdd.map(a => { a(0) +=1; a.head }).sum 
// Double = 6.0 
rdd.map(a => { a(0) +=1; a.head }).sum 
// Double = 9.0 

Seit Funktion, die wir in den ersten map verwenden nicht rein und modifiziert sein wandelbares Argument anstelle diesen Änderungen werden bei jeder Ausführung akkumuliert und in unvorhersehbarem Ausgang führen. Wenn zum Beispiel rdd aus dem Cache entfernt wird, können wir wieder 3.0 bekommen. Wenn einige Partitionen nicht zwischengespeichert sind, können Sie Ergebnisse mischen.

PySpark bietet eine stärkere Isolierung und die Erzielung von Ergebnissen wie dies ist nicht möglich, aber es ist eine Frage der Architektur nicht eine Unveränderlichkeit.

Die Nachricht zum Wegnehmen ist, dass Sie bei der Arbeit mit veränderlichen Daten äußerst vorsichtig sein und jegliche Änderungen vermeiden sollten, sofern dies nicht ausdrücklich erlaubt ist (fold, aggregate).