2014-09-02 6 views
12

sagen, dass ich drei RDD Transformationsfunktion auf RDD1 genannt haben:Wie weit wird Spark RDD Cache gehen?

def rdd2 = rdd1.f1 
def rdd3 = rdd2.f2 
def rdd4 = rdd3.f3 

Jetzt möchte ich rdd4 zwischenzuspeichern, so nenne ich rdd4.cache().

Meine Frage:

Wird nur das Ergebnis der Aktion auf rdd4 zwischengespeichert werden oder wird jeder RDD oben rdd4 zwischengespeichert werden? Angenommen, ich möchte sowohl rdd3 als auch rdd4 zwischenspeichern. Muss ich sie separat zwischenspeichern?

Antwort

19

Die ganze Idee des Caches ist, dass Spark die Ergebnisse im Speicher nicht speichert, wenn Sie es nicht sagen. Wenn Sie also die letzte RDD in der Kette zwischenspeichern, werden die Ergebnisse nur im Speicher gespeichert. Also, ja, müssen Sie sie separat zwischenzuspeichern, aber im Kopf behalten müssen Sie nur ein RDD zwischenzuzuspeichern, wenn Sie es benutzen werden als einmal, zum Beispiel:

rdd4.cache() 
val v1 = rdd4.lookup("key1") 
val v2 = rdd4.lookup("key2") 

Wenn Sie nicht Cache nennen In diesem Fall wird rdd4 für jeden zu durchsuchenden Aufruf neu berechnet (oder jede andere Funktion, die ausgewertet werden muss). Vielleicht möchten Sie die paper on RDD's lesen, es ist ziemlich einfach zu verstehen und erklärt die Ideen hinter bestimmten Entscheidungen, die sie hinsichtlich der Funktionsweise von RDD getroffen haben.

+0

Schätzen Sie Ihre Antwort. Wann immer es eine Gabelung gibt, müssen Sie diese rdd zwischenspeichern, um die wiederholte Berechnung zu reduzieren. Der einzige Schmerz ist, auf der zwischengespeicherten rdd (da ich multiple-fork auf meiner rdd-Transformation habe) aufzulösen. Ich werde die Zeitung noch einmal lesen. Danke – EdwinGuo

+0

@EdwinGuo zitieren Sie mich nicht auf diesem, aber ich denke, die meisten Leute finden, dass die zusätzliche Zeit zu unpersistenzen ist in der Regel mehr Mühe, als es wert ist, ist es besser, die JVM damit umgehen zu lassen, wie widerstandslos ist eine sehr teure Operation – aaronman

+0

ok, Soll ich eine andere Frage dazu aufschlagen? versuche auf Unpersisten zu suchen, kein Glück. "Markieren Sie die RDD als nicht persistent, und entfernen Sie alle Blöcke aus dem Speicher und der Festplatte." von der gitHub, nicht viel zu erwähnen – EdwinGuo