2016-03-24 18 views
4

cache Ich baue eine generische Funktion, die eine RDD empfängt und einige Berechnungen darauf durchführt. Da ich mehr als eine Berechnung auf dem Eingabe-RDD ausführe, möchte ich es zwischenspeichern. Zum Beispiel:Was passiert, wenn ich die gleiche RDD zweimal in Spark

public JavaRDD<String> foo(JavaRDD<String> r) { 
    r.cache(); 
    JavaRDD t1 = r... //Some calculations 
    JavaRDD t2 = r... //Other calculations 
    return t1.union(t2); 
} 

Meine Frage ist, da r mir gegeben ist, kann es oder nicht bereits im Cache gespeichert werden kann. Wenn es zwischengespeichert wird und ich cache es wieder auf, wird Funke eine neue Schicht des Zwischenspeichers verursachen, der bedeutet, dass, während t1 und t2 berechnet werden, ich zwei Instanzen von r im Cache haben werde? oder wird funken ist der Tatsache bewusst, dass r zwischengespeichert ist und wird es ignorieren?

Antwort

9

Nichts. Wenn Sie cache auf einer zwischengespeicherten RDD aufrufen, geschieht nichts, RDD wird (einmal) zwischengespeichert. Caching, wie viele andere Transformationen, ist faul:

  • Wenn Sie anrufen cache, die RDD des storageLevel wird auf MEMORY_ONLY
  • Wenn Sie cache wieder aufrufen, wird es auf den gleichen Wert (keine Änderung)
  • Nach der Auswertung überprüft Spark, wenn die zugrundeliegende RDD vorliegt, die RDDs storageLevel, und wenn sie zwischengespeichert werden müssen, wird sie zwischengespeichert.

So bist du sicher.

+0

Bezüglich Ihrer Anmerkung, ist es etwas, was ich für eine frage mich, während jetzt und hat keine Aufzeichnung davon gefunden. Wenn Ihre Antwort richtig ist und der Aufrufcache nur ein Flag im RDD-Objekt ändert, warum kann ich nicht dasselbe Objekt verwenden? –

+0

Ich werde meine Frage auf dem Zettel ein wenig erläutern. Wenn RDD "orig" genannt wurde und jemand außerhalb der Funktion "r = orig.cache();", dann habe ich im Funktionsaufruf "cached = r.cache();". Wenn das, was du sagst, wahr ist, werde ich mit den gleichen Daten enden, die zweimal im Cache gespeichert sind, einmal als "r" und einmal als "im Cache", oder? –

+1

Sie haben Recht - ich liege falsch. Es ist nicht notwendig, den Rückgabewert "cache" zu verwenden, es wird 'this' zurückgegeben - genau RDD. –

1

Testen Sie einfach auf meinem Cluster, Zohar ist richtig, nichts passiert, es wird nur die RDD einmal cachen. Der Grund, denke ich, ist, dass jede RDD intern eine id hat, Funke wird die id verwenden, um zu markieren, ob eine RDD zwischengespeichert wurde oder nicht. Wenn Sie also eine RDD mehrere Male zwischenspeichern, wird nichts unternommen.

unten mein Code und Screenshot:

enter image description here enter image description here

aktualisiert [Code hinzufügen, je nach Bedarf]


### cache and count, then will show the storage info on WEB UI 

raw_file = sc.wholeTextFiles('hdfs://10.21.208.21:8020/user/mercury/names', minPartitions=40)\ 
       .setName("raw_file")\ 
       .cache() 
raw_file.count() 

### try to cache and count again, then take a look at the WEB UI, nothing changes 

raw_file.cache() 
raw_file.count() 

### try to change rdd's name and cache and count again, to see will it cache a new rdd as the new name again, still 
### nothing changes, so I think maybe it is using the RDD id as a mark, for more we need to take a detailed read on 
### the document even then source code 

raw_file.setName("raw_file_2") 
raw_file.cache().count() 
+1

Bitte fügen Sie Ihren Code anstelle eines Screenshots hinzu! – eliasah

+0

Danke, wissen Sie zufällig, ob was @TzachZohar bezüglich cach() wahr ist. Wenn ja, müssten Sie nicht 'raw_file = raw_file.cache()' schreiben? –

+3

@RoeeGavirel Cache ist nur eine Methode von RDD, es gibt nichts zurück, hier ist das Dokument: http://spark.apache.org/docs/latest/api/python/pyspark.html#pypspark.RDD.cache –

Verwandte Themen