Ich schreibe ein Diagramm-bezogenes Programm in Scala
mit Spark
. Der Datensatz hat 4 Millionen Knoten und 4 Millionen Kanten (Sie können dies als Baum behandeln), aber ich bearbeite für jeden Zeitpunkt (ein) nur einen Teil davon, nämlich einen Unterbaum, der von einem bestimmten Knoten verwurzelt ist, und den Knoten in einem Pfad zwischen diesem gegebenen Knoten und dem Root.Was ist der effiziente Weg, den Wert in Sparks RDD zu aktualisieren?
Die Iteration
hat Abhängigkeit, was bedeutet i+1
braucht das Ergebnis von i
. Also muss ich das Ergebnis von jedem Iteration
für den nächsten Schritt speichern.
Ich versuche, eine effiziente Art und Weise zu finden RDD
zu aktualisieren, haben aber keine Ahnung, so far.I feststellen, dass PairRDD
eine lookup
Funktion haben, die die Rechenzeit von O(N)
, auf O verringern könnte (M
), N
die bezeichnen Gesamtzahl der Objekte in RDD
und M
bezeichnen die Anzahl der Elemente in jeder Partition.
Also ich denke, gibt es sowieso, dass ich ein Objekt in der mit O(M)
aktualisieren könnte? Oder mehr ideal, O (1)? (Ich sehe eine E-Mail in Spark Mail-Liste sagen, dass die lookup
kann modifiziert werden, um O zu erreichen (1))
Eine andere Sache ist, wenn ich O(M)
für die Aktualisierung der RDD
erreichen könnte, Könnte ich die Partition auf eine Nummer größer als die Anzahl der Kerne erhöhen und eine bessere Leistung erzielen?
RDD unveränderlich ist, können Sie nur eine neue RDD durch Transformation erstellen, aber es nicht aktualisieren kann. – cloud
@cloud Danke für deinen Kommentar, bedeutet das, dass ich eine ganze neue RDD anstatt nur einer Partition erstellen muss? – bxshi
Das war's. Ich werde eine Antwort schreiben, um es im Detail zu erklären. – cloud