Blog

Extrahieren von Flink Flame Graph Daten für die Offline-Analyse

Krzysztof Chmielewski

Aktualisiert Oktober 15, 2025
5 Minuten

Einführung - was sind Flammendiagramme?

Im Leben eines Entwicklers gibt es einen Moment, in dem die von uns erstellte Anwendung nicht so effizient arbeitet, wie wir es erwarten würden. In solchen Fällen greifen wir auf Tools zurück, mit denen wir ein Profil unserer Anwendung erstellen können, um den Speicher- und CPU-Verbrauch zu überprüfen. Bei diesen Tools handelt es sich hauptsächlich um Speicher- und CPU-Profiler wie JVisualVM, Java Mission Control und yourKit, um nur einige zu nennen. Eine großartige Ergänzung zu diesen Tools sind Flame Graphs. Um die offizielle Flame Graph Dokumentation zu zitieren: Flame Graphen sind eine Visualisierung hierarchischer Daten, die erstellt wurde, um Stack Traces von profilierter Software zu visualisieren, so dass die häufigsten Code-Pfade schnell und genau identifiziert werden können.

Ein Flame-Diagramm zeigt Ihnen nicht, wie viel Zeit Sie für die Ausführung der Methode aufwenden, sondern wie viel Prozent der gesamten Ausführungszeit auf diese bestimmte Methode entfällt. Mit diesen Informationen ausgestattet, können Sie Engpässe in Ihrer Anwendung leicht identifizieren.

Zufälligerweise ist Flink 1.13, Flame Graphs werden von Flink nativ unterstützt. Das kleine Problem mit den von Flink erzeugten Flame-Graphen ist jedoch, dass Sie keinen Schnappschuss der Flame-Graphen-Daten machen können, um sie später oder offline im Detail zu analysieren . Das liegt daran, dass ein Flame Graph während der Auftragsausführung regelmäßig aktualisiert wird und nach Beendigung eines Auftrags nicht mehr verfügbar ist, was bei Batch-Aufträgen ein Problem darstellt. In diesem Artikel zeige ich Ihnen, wie Sie Flame Graph-Daten für die Offline-Analyse aus der Flink-Benutzeroberfläche extrahieren können.

Aktivieren von Flink Flame Diagrammen

Um FlameGraphs zu aktivieren, muss die Option rest.flamegraph.enabled in conf/flink-conf.yaml auf dem Knoten Job Manager auf true gesetzt werden. Nachdem Sie diese Option aktiviert haben, wird auf der Flink-Benutzeroberfläche eine neue Registerkarte mit dem Titel "FlameGraph" verfügbar sein. Um einen Flame Graph zu erstellen, müssen Sie zum Job Graph eines laufenden Auftrags navigieren, einen Operator von Interesse auswählen und im Menü auf der rechten Seite auf die Registerkarte Flame Graph klicken. Für unser Beispiel werden wir nur den On-CPU-Modus betrachten.


Nachdem Sie auf die Registerkarte "FlameGraph" geklickt haben, beginnt das System, Stapelproben zu sammeln. Nach einiger Zeit erscheint das FlameGraph-Bild auf dem Bildschirm.

Erfassen von Flame Graph Daten

Als Testauftrag verwenden wir einen einfachen Flink-Streaming-Auftrag, der einen Strom von Ereignissen verarbeitet, die als Entität "Order" ausgedrückt werden. Wenden Sie die Anonymisierung auf die Parteidaten an und erstellen Sie dann die bereits erstellte Sitzungs-ID oder weisen Sie diese zu. Später werden die Bestellungen in den Clusterprotokollen ausgedruckt. Den Quellcode für diesen Job finden Sie hier.

Dies ist das gleiche Projekt, das wir in unserem vorherigen Tech-Blog mit dem Titel Flink-Jobs mit dem Spring-Framework für die Injektion von Abhängigkeiten schreiben . Wenn Sie diesen Blog noch nicht gelesen haben, sollten Sie das unbedingt nachholen. Es demonstriert, wie das Spring-Framework für die Erstellung Ihrer Flink-Jobs verwendet werden kann.

Nachdem der Flink-Job an den Flink-Cluster übermittelt und erfolgreich initialisiert wurde, navigieren Sie zum Jobgraphen und wählen das Feld "Process → Sink" und dann die Registerkarte "FlameGraph".


Nach einiger Zeit sollten die Messergebnisse auf dem Bildschirm erscheinen.

Jetzt kommt der schwierige Teil. Wenn es Ihnen gelingt, die Daten des Kontrollpunkts zu erfassen, stellen Sie sicher, dass Sie die vollständigen Daten des Flammendiagramms sehen -> root bar on the bottom.
Dann:

  • Öffnen Sie die Browser-Entwicklungswerkzeuge (Google Chrome und MS Edge - F12)
  • Navigieren Sie zur Registerkarte "Netzwerk" und suchen Sie nach der REST-Anfrage "flamegraph":

Nachdem Sie die Anfrage gefunden haben, doppelklicken Sie auf sie. Die Antwort auf die Anfrage sollte im Browser angezeigt werden.


Wählen Sie den gesamten Inhalt aus und speichern Sie ihn dann als json-Datei. Was wir gerade gespeichert haben, sind die Flame Graph-Daten, die vom Flink-Backend erfasst, vorverarbeitet und an die Flink-Benutzeroberfläche gesendet wurden.

Erstellen des Flame-Diagramms von Flink

Wenn wir nun die Flame Graph-Rohdaten aus dem Flink-Backend extrahiert haben, können wir mit etwas JavaScript-Magie den Graphen erstellen. Zu diesem Zweck verwenden wir die Bibliothek d3-flame-graph, mit der ich eine sehr einfache Seite erstellt habe, mit der Sie exportierte Daten durchsuchen können. Um den Code zu erhalten, besuchen Sie das PlotFlinkFlameGraphs Repository, wo Sie die index.html finden.Wenn Sie die index.html in Ihrem Webbrowser öffnen, sehen Sie eine einfache Benutzeroberfläche. Klicken Sie unten links auf die Schaltfläche "Datei auswählen" und wählen Sie die im vorherigen Kapitel erstellte json-Datei aus. Am Ende sollten Sie etwas ähnliches wie das hier sehen:


Sie können auf einzelne Kacheln klicken, um sie zu vergrößern. Klicken Sie auf die Schaltfläche "Zoom zurücksetzen", um zur ursprünglichen Ansicht zurückzukehren. Wenn Sie neue Daten laden möchten, klicken Sie einfach erneut auf die Schaltfläche "Datei auswählen" unten links.

Voilà, jetzt haben Sie einen Flame Graph aus Flink-Daten, den Sie offline analysieren können.

Sie können dieses brillante Tool anhand von Beispieldaten ausprobieren, die in das Repository hochgeladen wurden.
Können Sie erkennen, was in diesem Fall ein Problem verursacht? Lassen Sie es uns in den Kommentaren wissen ;).

Fazit

Ab Flink 1.13 haben wir Zugriff auf ein großartiges Tool zum Debuggen von Engpässen bei Flink-Jobs: Flame Graphs. In diesem Blogbeitrag habe ich Ihnen gezeigt, wie Sie Daten aus der Flink-Benutzeroberfläche extrahieren und daraus einen Flame Graph für die Offline-Analyse erstellen können. Dies löst das Problem, dass der Flink Flame Graph während der Jobausführung aktualisiert wird oder sogar nicht mehr verfügbar ist, nachdem ein Job beendet wurde . Mit unserem raffinierten Javascript-Code, der auf der d3-flame-graph Bibliothek basiert, können Sie diese Daten analysieren, wann immer Sie wollen.

Verfasst von

Krzysztof Chmielewski

Contact

Let’s discuss how we can support your journey.