2017-03-02 8 views
0

ich diesen Code leite gefüllt. Der Code funktioniert gut für 2-3 Städte. Aber dann beginnt sich die Erinnerung an die Arbeiter zu füllen und das Programm wird schmerzhaft langsam. Warum ist die Erinnerung voll? Wird die Garbage Collection nicht ausgeführt oder gibt es einen Speicherverlust in meinem Code? Ich überwache die Speicheranforderungen für jede Stadt und es verdoppelt sich jedes Mal, ohne zu fallen, wenn eine Stadt fertig ist. Wie sollte ich den RAM nach jeder Iteration aufräumen? DankSpeicher wird in Spark-Scala

Konfiguration - 3 m4.2xlarge Arbeiter, 8 Knoten, 30 GB RAM, 6 Testamentsvollstrecker mit jeweils 4 Adern

Antwort

0

Es ist eine ziemlich schlechte Praxis ein for-Schleife in Funken zu verwenden, da der Spark-Optimierer ist grundsätzlich zu dumm dafür.

Meine Idee wäre, zuerst alle Daten in einen gemeinsamen Datenrahmen zu bekommen. Also im Grunde würden Sie wie folgt vor:

var city = listOfCities.value(1) 
    var data = getDataFromQueries(redshiftConnector, sparkSession, city) 
    for (i <- Range(2, listOfCities.value.length)){ 
    var city = listOfCities.value(i) 
    var data = data.unionAll(getDataFromQueries(redshiftConnector, sparkSession, city)) 
    } 

Danach einfach mit Ihrem Programm auch weiterhin für den „großen“ Datenrahmen

Verwandte Themen