2016-11-03 1 views
2

in der Vergangenheit zu ändern, ich mit niedrigem Niveau Parallelisierung gearbeitet (openmpi, openmp, ...)Best-Verfahren Inmutable Funken RDDs

ich zur Zeit in einem Spark-Projekt arbeiten bin und ich weiß nicht, das beste Verfahren mit RDDs zu arbeiten, weil sie unveränderbar sind.

Ich werde mein Problem mit einem einfachen Beispiel erklären, stellen Sie sich vor, dass ich in meiner RDD ein Objekt habe und ich ein Attribut aktualisieren muss.

Die praktischste und speichereffizienteste Lösung ist die Implementierung einer Methode namens setAttribute (new_value).

Funken RDDs sind inmutable, so brauche ich eine Funktion (zB myModifiedCopy (new_value)), die eine Kopie dieses Objekts zurück, aber mit dem new_value in seiner Eigenschaft und die Aktualisierung des RDD wie diese zu erstellen:

myRDD = myRDD.map(x->x.myModifiedCopy(new_value)).cache() 

Meine Objekte sind sehr komplex und sie verwenden viel RAM-Speicher (sie sind wirklich riesig). Dieser Vorgang ist langsam, Sie müssen eine vollständige Kopie aller Elemente der RDD erstellen, um nur einen kleinen Wert zu ändern.

Gibt es ein besseres Verfahren, um mit dieser Art von Problemen umzugehen?

Empfehlen Sie eine andere Technologie?

Ich würde für eine veränderbare RDD töten.

Vielen Dank im Voraus.

+0

Möglicherweise müssen Sie zur Kasse gehen http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence – Shankar

+0

Sie können Ihre RDD auf DISK oder OFF_HEAP speichern, wenn Speicher das einzige Problem ist. – Shankar

+0

Wenn Speicher das Problem ist, dann würde ich es nicht zwischenspeichern. Ich würde einfach mehr Partitionen mit der Eigenschaft 'spark.default.parallelism' verwenden. Aber ich denke, das ist nicht das Hauptproblem, das er lösen will? –

Antwort

1

Ich glaube, Sie haben einige Missverständnisse von Apache Spark. Wenn Sie eine Transformation durchführen, erstellen Sie tatsächlich keine ganze Kopie dieser im Speicher. Sie entwerfen lediglich die Serie winziger Konvertierungen, die in jedem Datensatz ausgeführt werden sollen, wenn Sie eine Aktion ausführen. Zum Beispiel map, filter und flatMap sind völlig Transformationen, also faul, also, wenn Sie sie ausführen, Sie nur den Plan entwerfen, aber nicht ausführen. Auf der anderen Seite, collect oder count verhalten sich anders sie Trigger alle vorherigen Transformationen (alles tun, was in der Zwischenstufe Stufen definiert wurde), bis sie das Ergebnis erhalten.

+0

Meine Prozedur ist eine Schleife, in jeder Iteration rufe ich eine map/reduce-Operation auf und ich modifiziere einige Variablen in der RDD mit dem Ergebnis der Reduktion und anderer externer Variablen. Ich rufe count() oder cache() in jeder Iteration auf, weil die reduce() -Operation nach einigen Iterationen sehr langsam ist, wenn ich das nicht tue. – Rob

+0

Wie viele Iterationen? Was genau musst du erreichen? Ich denke, dass diese Informationen den Kontext komplett verändert haben. –

+0

Die Anzahl der Iterationen kann sich ändern. Der Algorithmus muss konvergieren.Mehr oder weniger ein Minimum von 50 Iterationen und ein Maximum von 1000. Das ist der Grund, warum ich cache() oder count() bei jeder Iteration aufrufen muss. Mein Ansatz ist ineffizient, ich weiß, vielleicht ist ein anderer Ansatz besser, vielleicht eine andere Technologie. Ich weiß es nicht. – Rob