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?
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. –