2017-12-07 3 views
0

Ich habe eine Spark-Streaming-Anwendung, die aus Kafka Thema liest und schreibt die Daten auf HDFs im Parkett-Format. Ich sehe, dass während der Zeit (sehr kurze Zeit) der physische Speicher des Containers wächst, bis es die maximale Größe erreicht und schlägt fehl "Diagnose: Container [pid = 29328, containerID = container_e42_1512395822750_0026_02_000001] läuft über physische Speichergrenzen hinaus Verwendung: 1,5 GB physischer Speicher mit 1,5 GB, 2,3 GB virtueller Speicher mit 3,1 GB, Killing Container. " Der Container, der getötet wird, ist derselbe, der den Treiber ausführt, sodass die Anwendung ebenfalls beendet wird. Bei der Suche nach diesem Fehler sah ich nur Lösungen zur Erhöhung der Speicher, aber das wird das Problem nur verschieben. Ich möchte verstehen, warum der Speicher zunimmt, wenn ich nichts im Speicher speichere. Ich habe auch gesehen, dass alle Container Speicher zugenommen haben, aber sie werden nur nach einer Weile (vor Erreichen des Maximums) getötet. Ich sah in einem Post "Ihr Job ist Parkett Daten zu schreiben, und Parkett speichert Daten im Speicher vor dem Schreiben auf die Festplatte".Spark-Job Schreiben auf Parkett - hat einen Container mit physikalischem Speicher, der weiter zunimmt

Der Code, den wir verwenden (wir versuchen, auch ohne die Neuaufteilung - nicht sicher, was benötigt wird):

val repartition = rdd.repartition(6) 
val df: DataFrame = sqlContext.read.json(repartition) 
df.write.mode(SaveMode.Append).parquet(dbLocation) 

Gibt es eine Möglichkeit, die Speichererweiterung Problem nur zu beheben?

Die erstellten Parkett Dateien The created parquet files

Die NodeManager Protokolle, die die Erhöhung der Speicher zeigen enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

Antwort

0

Ihre Anwendung Unter der Annahme, macht nichts anderes, als nur schreibt Ich vermute, dass die Ursache die Größe ist von Daten, die in Batches empfangen werden. Es ist möglich, dass die in einer der Stapel empfangenen Daten die konfigurierten Schwellenwerte überschreiten. Unter der Annahme, dass die Anwendung für diese Saison getötet wird, ist die Lösung "Gegendruck" zu aktivieren. Die Lösung ist detailliert genug in der Post unten.

Limit Kafka batches size when using Spark Streaming

+0

Der Speicher wird nicht auf einmal erhöht, hält nur mit der Zeit steigen, so scheint es, wie die Daten wirklich zwischengespeichert werden, sind aber nicht vom Garbage Collector gelöscht. Unsere Anwendung stirbt nach 9 Stunden mindestens – LubaT

+0

Verwenden Sie Transformationen wie Unionen oder Update per Schlüssel in der Datenpipeline? – nkasturi

+0

Nein, der Code, den ich hinzugefügt habe, ist alles, was wir tun – LubaT

Verwandte Themen