2017-06-01 2 views
0

Ich bin eine Spark-Anwendung erstellen, die mit sehr großen Matrizen arbeitet, die viele GB pro Matrix benötigen. Ich bin mit Funken auf einer einzigen AWS-Instanz den folgenden Aufruf verwenden:Java-Heap nicht den Speicher abgerufen in Spark-Submit

spark-submit --driver-memory 20g --executor-memory 20g --class "mycoordinates.App" --master local[7] my.jar args 

Sobald mein Problem setzt eine bestimmte Größe Schwelle erreicht ich immer OOM Fehler starten und den Treiber Speicher zu erhöhen löse das Problem nicht (mein Verständnis ist, dass bei master = local die Einstellung des Executorspeichers keine Rolle spielt ... Ich habe es auf jeden Fall erhöht, nur um sicher zu sein, und es hatte auch keinen Effekt.

Innerhalb meiner Bewerbung habe ich die folgenden Anweisungen den Heap (Programmierung in scala) zu überprüfen:

println(" mem avail: " + java.lang.Runtime.getRuntime().totalMemory()) 
println(" max mem: " + java.lang.Runtime.getRuntime().maxMemory()) 
println(" free mem: " + java.lang.Runtime.getRuntime().freeMemory()) 

Es folgt eine typische Ausgabe:

Treiber Speicher auf 20G

mem avail: 2075918336 
max mem: 21099708416 
free mem: 1720845616 

Treiberspeicher auf 8G eingestellt

mem avail: 2075918336 
max mem: 8303607808 
free mem: 1720720376 

Treiber Speicher 3G gesetzt

mem avail: 2075918336 
max mem: 3113877504 
free mem: 1720850720 

Treiber Speicher 1G gesetzt

mem avail: 1037959168 
max mem: 1037959168 
free mem: 1000899656 

MaxMemory Der Wert scheint von der Befehlszeile Einstellen der Treiberspeicher zu verfolgen, wie erwartet. Das TotalMemory und FreeMemory tun dies jedoch nicht. Wenn ich die Treiberspeichereinstellung unter 2G reduziere, werden totalMemory und freeMemory wie erwartet reduziert. Aber für Treiberspeichereinstellungen über 2G ändern sie sich nicht. Der totalMemory-Wert ist immer genau gleich. Der freeMemory-Wert ändert sich ein wenig, scheint aber nur eine zufällige Variation zu sein. Der Wert liegt immer in einem kleinen Bereich.

Ich habe auch die Spark Config-Einstellungen aus der App gedruckt, und sie scheinen alle mit den Einstellungen der Befehlszeile übereinzustimmen.

Alle Informationen, die ich bisher gefunden habe, zeigen an, dass --driver-memory die Größe des Heapspeichers erhöht. Aber es scheint, als gäbe es noch eine andere Parametereinstellung, die die Größe des Heapspeichers auf 2 GB begrenzt.

Kann mir jemand sagen, was noch konfiguriert werden muss, damit der Heap über 2 GB hinaus wächst?

+0

Nach mehr Suche konnte ich feststellen, dass ich ein Argument bis zum Jvm passieren kann: --driver-java-Optionen -Xms8g. Jetzt frage ich mich, ob es eine Möglichkeit gibt, dass der jvm standardmäßig den maximalen Speicher für die anfängliche Zuweisung verwendet, so dass ich diese zwei verschiedenen Argumente nicht koordinieren muss. –

Antwort

0

Java reserviert Speicher faul. Es wird nicht mehr Speicher zugewiesen, als es derzeit benötigt, es sei denn, Sie geben dies beim Start an. In diesem Fall benötigt es 2G, aber wenn ich es richtig lese, gibt es an, dass es bis zu dem angegebenen GB-Wert gehen kann.

Schreiben SO up: What are Runtime.getRuntime().totalMemory() and freeMemory()?

+0

Ja, das war, was ich erwartet habe, aber ich hatte einen Fall, in dem ich einen Speichermangelfehler bekam, obwohl der Max-Heap groß genug war. Das Angeben des ersten Heapspeichers, um den Max-Heap zu verwenden, schien das Problem zu beheben. Jetzt versuche ich jedoch, dieses Beispiel zu reproduzieren, und ich kann es nicht. Also änderte sich vielleicht etwas anderes und ich habe es nicht bemerkt. –

Verwandte Themen