Mysql
 sql >> Datenbank >  >> RDS >> Mysql

java.lang.OutofMemorySpace:Java-Heap-Space beim Abrufen von 120 Millionen Zeilen aus der Datenbank in PySpark

Sie versuchen, zu viele Daten in den RAM zu laden . Sie sollten zuerst die Datenmenge reduzieren, die SQL von Ihnen abruft, bevor sie Spark erreichen und optimieren Sie es mithilfe von Spark-Parametern, zum Beispiel partitions .

Erwägen Sie eine oder mehrere dieser Optimierungen:

  • Angeben in SELECT welche Spalten explizit angezeigt werden sollen, möglichst nur die, die Sie benötigen;
  • (Raw query) Schleife in einem while Zyklus, bis Sie fetch können Zeilen durch Schleifen jeder Zeile. Die folgenden Techniken könnten funktionieren, indem eine Konstante n_rows gesetzt wird um in den Speicher einzulesen und i zu aktualisieren Index jedes Radfahren:

LIMIT i,i+n_rows

BETWEEN i AND i+n_rows

WHILE primaryKey >= i AND primaryKey < i+n_rows

  • Verwendung von Partitionen . Verwenden Sie partitionColumn , lowerBound , upperBound und numPartitions (Referenz 1) und (Referenz 2) :

partitionColumn Wählen Sie die Spalte aus, die verwendet wird, um zu bestimmen, wie die Daten aufgeteilt werden sollen (z. B. der Primärschlüssel ).

lowerBound legt den Mindestwert fest von partitionColumn das wird geholt.

upperBound legt den Maximalwert fest von partitionColumn das wird geholt.

numPartitions bedeutet, wie viele parallele Verbindungen Sie zum Lesen von Daten über RDBMS einrichten möchten.

Spark ruft Ihre Datensätze also mit Zeilen ab, die Sie erhalten würden, wenn Sie SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound ausführen würden .