3

Ich versuche NiFi verwenden, um große CSV-Dateien (potenziell Milliarden von Datensätzen) mit HDF 1.2 zu verarbeiten. Ich habe meinen Flow implementiert und alles funktioniert gut für kleine Dateien.Apache NiFi - OutOfMemory Fehler: GC Overhead Limit überschritten auf SplitText Prozessor

Das Problem ist, dass, wenn ich versuche, die Dateigröße auf 100 MB (1M Datensätze) zu schieben ich ein java.lang.OutOfMemoryError: GC overhead limit exceeded vom SplitText Prozessor erhalte verantwortlich für die Datei in einzelne Datensätze zu splitten. Ich habe nach dem gesucht, und es bedeutet im Grunde, dass der Garbage Collector zu lange ausgeführt wird, ohne viel Heap-Speicherplatz zu erhalten. Ich erwarte, dass zu viele Flow-Dateien zu schnell generiert werden.

Wie kann ich das lösen? Ich habe versucht, die nifi-Konfiguration in Bezug auf den maximalen Heap-Speicher und andere speicherbezogene Eigenschaften zu ändern, aber nichts scheint zu funktionieren.

Jetzt habe ich eine Zwischen SplitText mit einer Zeilenzahl von 1K und das ermöglicht es mir, den Fehler zu vermeiden, aber ich sehe das nicht als eine solide Lösung für, wenn die eingehende Datei möglicherweise viel mehr werden wird als das, ich fürchte, ich werde das gleiche Verhalten vom Prozessor bekommen.

Jeder Vorschlag ist willkommen! Danke

Antwort

4

Der Grund für den Fehler ist, wenn 1M Datensätze mit einer Zeilenanzahl von 1 aufteilen, erstellen Sie 1M Flow-Dateien, die 1M Java-Objekte gleichsetzen. Insgesamt ist es üblich, zwei SplitText-Prozessoren zu verwenden und alle Objekte gleichzeitig zu erstellen. Sie könnten wahrscheinlich eine noch größere Split-Größe beim ersten Split verwenden, vielleicht 10k. Für eine Milliarde Datensätze frage ich mich, ob ein drittes Level sinnvoll wäre, aufgeteilt von 1B auf vielleicht 10M, dann 10M auf 10K, dann 10K auf 1, aber ich müsste damit spielen.

Einige zusätzliche Dinge zu berücksichtigen sind die Erhöhung der Standard-Heap-Größe von 512 MB, die Sie bereits getan haben, und auch herauszufinden, ob Sie wirklich auf 1 Zeile aufgeteilt werden müssen. Es ist schwer zu sagen, ohne etwas anderes über den Fluss zu wissen, aber in vielen Fällen, wenn Sie jede Zeile irgendwo liefern möchten, könnten Sie möglicherweise einen Prozessor haben, der eine große Datei mit Begrenzern einliest und jede Zeile zum Ziel streamt. Zum Beispiel funktionieren PutKafka und PutSplunk so, dass sie eine Datei mit 1M Zeilen aufnehmen und jede Zeile zum Ziel streamen können.

+0

Wenn es keine "one-shot" Möglichkeit gibt, dies zu tun, werde ich definitiv mehrere Ebenen ausprobieren. Bezüglich PutKafka würde ich Kafka zusammen mit NiFi im Cluster aufbauen. Ignorieren Sie die Tatsache, dass dies einige Cluster-Ressourcen braucht, gibt es Vorteile aus einer Performance oder anderen Standpunkten? Danke wie immer für die nützlichen Informationen über das Verhalten von NiFi. – riccamini

+1

Nun, ich wollte nicht unbedingt sagen, dass du Kafka als Teil davon brauchst. Ich habe mich mehr gefragt, was du in deinem Flow machen willst, nachdem du auf 1 Zeile pro Flow-Datei aufgeteilt hast, um zu sehen, ob du das wirklich tun musst . Viele Male möchten die Leute diese Zeilen nur an ein externes System liefern, und in diesen Fällen könnte es möglich sein, einen Prozessor zu haben, der die große Datei streamt und jede Zeile irgendwo hinschickt, ohne Millionen von Flussdateien zu erstellen, die kafka und splunk waren nur zwei Beispiele dafür. –

+0

Ich muss die Dateien tatsächlich Zeile für Zeile aufteilen und dann eine andere Konvertierung/Normalisierung für jedes seiner Felder anwenden. Dann stoße ich jede Zeile wieder zusammen und exportiere alle auf Stock. – riccamini