2016-10-28 3 views
1

Hallo, ich bin neu zu entfachen, und ich habe einen Zweifel in einer Sache, die ich: eSpeicherbezogene Variablen in Spark-

ich eine 4.2 gb CSV-Datei zu einem Funken Datenrahmen gelesen und Persist es von

df_spark = spark.read_csv('data.csv',header=True) 
df_spark.persist() ###so MEMORY_ONLY 
df_spark.count() ### 6722244 which is correct 
# my spark conf is 
spark.driver.memory  48g 
spark.memory.fraction 0.7 
spark.driver.maxResultSize 4g 
spark.memory.storageFraction 0.3 

Aber nach persistieren in Funke UI localhost: 4040, in der Registerkarte Speicher kann ich Size_in_ Memory 1204.7 Mb sehen. Wenn ich es behalte (MEMORY_ONLY), sollte es nicht 4,2 GB sein? Auch die obige Einstellung in env.sh zeigt, wie die gesamte Speicherberechnung erfolgt.Wenn möglich, kann jemand erklären, wie viel ich einen Job ausführen muss ((48 * (1-0.7) ich denke, von der oben genannten Einrichtung.)

Bitte helfen Sie mir meine Verwirrung zu beseitigen

Antwort

0

1) MEMORY_ONLY Modus speichert deserialized Java-Objekte in der JVM. Die Größe des deserialisierten Objekts unterscheidet sich nun vollständig von der Größe in einer CSV-Datei. Zum Beispiel dauert eine Gleitkommazahl "1.2" in der CSV-Datei 3 Bytes, während ein "Double" im Speicher 8 Bytes benötigt und ein Double-Objekt sogar noch mehr Bytes (aufgrund des Platzbedarfs von Java-Objekten). Das erklärt, warum wir nicht erwarten können, dass die CSV-Größe auf der Festplatte mit der Nummer übereinstimmt, die Sie auf der Speicherregisterkarte von Spark UI sehen.

2) Ich bin nur neugierig wie und wo Sie diesen Job ausführen? Ihre Erwähnung von "localhost: 4040" sagt, dass Sie lokal ausgeführt werden, aber dann ist Ihr Treiberspeicher 48 GB. Das ist viel. Sie sollten den lokalen Modus nicht verwenden, um große Datenmengen zu verarbeiten, und in einer typischen Umgebung ist die Treiber-JVM klein und der Executor-Speicher ist in der Regel groß (abhängig von der Größe und den Eigenschaften des Problems). Eine andere Sache, die mir die Größe des Datensatzes im Speicher 1204 GB, d. H. 1,2 TB ... rätselt, die wiederum sehr groß ist, wenn sie mit dem Rohdatensatz von 4,2 GB verglichen wird. Welche Daten haben Sie in dieser CSV-Datei?

+0

@ Shirish-Es gab einen Tippfehler ,, es ist 1204 Mb. Ich habe das bearbeitet .. Und ich führe meinen Job auf einer einzigen Maschine ... von 64Gb RAM.4cpu. Wenn ich Ihren Punkt # 1 betrachte, dann sollte der verwendete Arbeitsspeicher mehr als 4,2 GB betragen, solange er bestehen bleibt. Also Größe_in_Memory ?? –

+0

Wir können nicht perfekt sagen, dass "size_in_memory" größer oder kleiner als die CSV-Größe auf der Festplatte ist. Entgegen dem obigen Beispiel betrachte man einen doppelten Wert 1.2345678923456789 benötigt 18 Bytes in CSV und nur 8 Bytes in JVM (mit 'double' Typ). Sie können also im Vergleich zu CSV einen kleineren oder größeren JVM-Footprint haben. Sie können "allgemein" erwarten, dass die JVM-Größe größer ist, wenn viele Zahlen/Ganzzahlen in Ihren Daten vorhanden sind, dies muss jedoch nicht immer der Fall sein. – ShirishT

+0

... hängt völlig von den Daten ab. – ShirishT