In unserem vorherigen Beitrag haben wir das TagSniff-Modell vorgestellt. TagSniff ist ein Ansatz zur Datenflussinstrumentierung, der eine Reihe von Primitiven für Online- und Post-hoc-Debugging-Aufgaben bietet. Beim Debuggen werden Fehler in Computerprogrammen lokalisiert und behoben. TagSniff hilft dabei, Tags zu Debug-Tupeln hinzuzufügen und Tupel zu identifizieren, die anhand ihrer Metadaten oder Werte einer weiteren Analyse bedürfen. TagSniff bietet zwei Primitive, Tag und Sniff, für die Instrumentierung des Debug-Tupels, das Anmerkungen und Metadaten enthält. In diesem Beitrag werden wir besprechen, wie man TagSniff für die beiden gängigen Datendebugging-Modi verwenden kann: Online- und Post-hoc-Debugging.
Online-Datendebugging
Debugging ist ein wesentlicher Bestandteil jedes Softwareentwicklungsprozesses, und es wird noch wichtiger, wenn es um Big-Data-Anwendungen geht. Das Debuggen von Big-Data-Anwendungen stellt neue Herausforderungen dar, da zur Behebung von Fehlern eine Kombination aus Code- und Dateninteraktivität erforderlich ist. Online-Debugging ist eine Technik, mit der Entwickler Big-Data-Anwendungen debuggen können, während der Job noch ausgeführt wird.
Online-Debugging ist für Big-Data-Anwendungen von entscheidender Bedeutung, da es Entwicklern ermöglicht, Haltepunkte für die Dateninspektion hinzuzufügen, benachrichtigt zu werden, wenn ein Absturz ausgelöst wird, und benachrichtigt zu werden, wenn bestimmte Bedingungen für die Daten erfüllt sind. In Big-Data-Anwendungen ist die Interaktivität zwischen Daten und Code ein entscheidender Aspekt des Online-Debuggings. Daher sind neue Interaktivitätsfunktionen erforderlich, um den Online-Debugging-Prozess effizient zu gestalten.
Man kann TagSniff für das Online-Debugging von Big-Data-Anwendungen verwenden. Es ermöglicht Benutzern, die Daten in verschiedenen Phasen des Datenflusses zu überprüfen, die Ursache von Abstürzen zu identifizieren und sich benachrichtigen zu lassen, wenn bestimmte Bedingungen erfüllt sind. Die Stärke von TagSniff liegt darin, wie es auf bestimmte Tag- und Sniff-Aufrufe reagiert, um Online-Debugging-Szenarien zu unterstützen.
Datenhaltepunkte
Dies ist ein wichtiger Aspekt des Online-Debuggings, da sie es Entwicklern ermöglichen, die Daten in verschiedenen Phasen des Datenflusses zu überprüfen. TagSniff bietet zwei Interaktivitätsaktionen, Next Tuple und Next operator, um das Debuggen von Daten-Breakpoints zu erleichtern. Mit dem nächsten Tupel kann der Benutzer Tupel untersuchen, die einen Nullwert enthalten. Sobald die Inspektion abgeschlossen ist, entfernt TagSniff die Tag-Pause und sendet sie an den nächsten Operator. Mit dem nächsten Operator kann der Benutzer überprüfen, wie das Tupel von den nachgeschalteten Operatoren transformiert wird. TagSniff gibt das Tag pause zusammen mit dem Tupel weiter, um die Ausführung mit der Sniff-Funktion im Downstream-Operator zu unterbrechen.
Die Ursachen eines Programmabsturzes
Sie sind ein erheblicher Grund zur Besorgnis bei Big-Data-Anwendungen. Ein Absturzverursacher ist ein Tupel, das zum Absturz eines Systems führt. Für die Behebung des Fehlers ist es unerlässlich, das schuldige Tupel und den Operator zu identifizieren, bei dem die Ausnahme aufgetreten ist. TagSniff bietet eine Catch-Funktion für Absturzschuldige, die jede Laufzeit-Ausnahme abfängt und das Tupel mit dem Tag „crash“ sowie der Exception-Trace, der Operator-ID und der Knoten-IP-Adresse annotiert. Im Folgenden veranschaulichen wir diese beiden Fälle:
Dieser Code wendet ein Crash-Tag auf jedes Tupel im Eingabe-Dataset an und verwendet dann eine Post-hoc-Assertion, um alle Tupel herauszufiltern, die das Crash-Tag haben. Der Tag Die Methode fügt jedem Tupel ein Crash-Tag mit einer Verkettung der Werte des Exception-Trace-TRC, der Operator-ID OID und der Knoten-IP-Adresse hinzu. Die schnüffeln Die Methode wendet dann einen Filter auf den Eingabedatensatz an und prüft, ob jedes Tupel das Crash-Tag hat. Wenn das Tupel das Crash-Tag hat, wird es zur weiteren Überprüfung zurückgegeben.
Alarmierung
Diese Funktion benachrichtigt den Benutzer, wenn ein Tupel eine interessante Bedingung erfüllt, z. B. einen Engpass oder eine Latenzmetrik. TagSniff bietet eine Alert-Funktion, die es dem Benutzer ermöglicht, Bedingungen für ein einzelnes Tupel oder eine Reihe von Tupeln hinzuzufügen. Das TagSniff-System sollte das Tag-Primitiv aufrufen, bevor und nachdem das Tupel durch den ReduceByKey-Operator ausgeführt wird. Das Sniff-Primitiv ruft die Zeitstempel-Metadaten aus dem Debug-Tupel ab, um die Latenz des ReduceByKey-Aufrufs zu berechnen, und prüft, ob sie über einem bestimmten Schwellenwert liegt. Hier ein Codeausschnitt, der diese Primitive veranschaulicht:
Wie zu sehen ist, versieht dieser Code jedes Tupel im Eingabedatensatz mit einem Zeitstempel und verwendet dann eine Post-hoc-Assertion, um alle Tupel herauszufiltern, deren Verarbeitung länger dauert als ein vordefinierter Schwellenwert. Die Tag-Methode fügt jedem Tupel ein Zeitstempel-Tag mit der aktuellen Systemzeit in Millisekunden hinzu. Die sniff-Methode wendet dann einen Filter auf den Eingabedatensatz an und prüft die Zeitdifferenz zwischen den beiden Zeitstempeln, die im Tag jedes Tupels gespeichert sind. Ist die Zeitdifferenz größer als der vordefinierte Schwellenwert, wird das Tupel zur weiteren Prüfung zurückgegeben.
Post-hoc-Datendebugging
Post-hoc-Debugging ist ein wichtiger Schritt in der Datenanalysepipeline, der dabei hilft, die zugrunde liegenden Probleme bei der Ausführung des Datenflusses zu identifizieren. Es findet in den Ausführungsprotokollen statt, sobald der Hauptdatenflussauftrag abgeschlossen ist. Die einfachen Ausführungsprotokolle bieten eine vereinfachte Ansicht, in der die Eingabe-, Zwischen- und Ausgabetupel entkoppelt sind. Daher können Benutzer die TagSniff-Primitive nutzen, um viel umfangreichere Ausführungsprotokolle mit einer logischen Ansicht zu erstellen.
Es gibt mehrere Post-hoc-Aufgaben, die Benutzer mit Hilfe von TagSniff ausführen können, z. B. Vorwärts- und Rückwärtsverfolgung, selektive Wiedergabe und Abstammungsinformationen. Benutzer können diese Protokolle analysieren, um das zugrunde liegende Problem zu identifizieren. Das Abrufen von Abstammungsinformationen oder das Abspielen eines Teils der Datenflussausführung für eine Teilmenge von Tupeln kann einiges an Programmierkenntnissen erfordern. Daher ist es wichtig, eine Reihe praktischer Methoden einzuführen, die verhindern, dass Benutzer viele Codezeilen schreiben.
Vorwärts- und Rückwärtsverfolgung
Durch die Vorwärts- und Rückwärtsverfolgung können Benutzer identifizieren, welche Ausgabetupel aus einem bestimmten Eingabetupel generiert wurden. Allgemeiner gesagt ermöglicht dieser Prozess Benutzern zu verstehen, wie ein bestimmtes Tupel durch verschiedene Operatoren im Datenfluss transformiert wird. Umgekehrt ermöglicht die Rückwärtsverfolgung den Benutzern, die Eingabetupel zu identifizieren, die ein bestimmtes Ausgabetupel generiert haben, was als Sonderfall von Abstammung ausgelegt werden könnte. Angenommen, ein Benutzer möchte ein Eingabetupel im gesamten Datenfluss verfolgen, wenn es ein leeres Wort enthält. Mithilfe der Protokolle kann der Benutzer entweder einen Ad-hoc-Datenfluss ausführen oder den ursprünglichen Datenfluss ausführen, der ordnungsgemäß mit TagSniff instrumentiert ist. Wir argumentieren, dass Letzteres viel einfacher ist. Das Tag-Primitiv annotiert alle Tupel, die einen leeren Wert enthalten, als trace, andernfalls als skip. Beachten Sie, dass ein TagSniff-System diese Tag-Funktion auf den Quelloperator anwenden würde, gefolgt von einer Sniff-Funktion. Diese Sniff-Funktion gibt für alle Tupel den Wert true zurück, da für jedes von ihnen ein Eingreifen des Systems erforderlich ist: entweder das Tupel dem Benutzer anzeigen (Trace) oder das Tupel aus dem Datenfluss entfernen (Skip). Der folgende Codeausschnitt veranschaulicht das obige Tag und den obigen Sniff:
Dieser Code wendet ein Tag auf jedes Tupel an, je nachdem, ob es einem Leerzeichen entspricht oder nicht. Wenn das Tupel ein Leerzeichen ist, fügt es das Tag „trace“ hinzu; andernfalls wird das Tag „skip“ hinzugefügt. Das schnüffeln Die Funktion wird dann verwendet, um eine Debugging-Ausgabe für jedes Tupel auszulösen, das ein Tag hat. In diesem Fall ist der schnüffeln Funktion kehrt einfach zurück wahr für jedes Tupel, das ein Tag hat, wodurch das System diese Tupel dem Benutzer zur weiteren Überprüfung anzeigt.
Selektive Wiedergabe
Die selektive Wiedergabe ermöglicht es einem Benutzer, Teile des Datenflussdiagramms wiederzugeben. Die selektive Wiedergabe hat mehrere Anwendungen, z. B. um zu verstehen, wie sich der Datenfluss auf eine Teilmenge des Datensatzes auswirkt, interaktive Abfragen von Zwischendatensätzen zum Debuggen durchzuführen und einen Teil des Workflows mit geänderten Eingaben erneut auszuführen. Angenommen, ein Benutzer ist daran interessiert, die Ausführung der Map- und ReduceByKey-Operatoren im folgenden Codeausschnitt, der die 100 häufigsten Wörter berechnet, selektiv wiederzugeben:
Um das obige Ziel zu erreichen, kann der Benutzer die Zwischenausgabe von Zeile 1 laden und den Rest des ursprünglichen Datenflusses ausführen, der mit TagSniff instrumentiert ist. Ein TagSniff-System würde nach dem ReduceByKey-Operator ein Tag und ein Sniff-Primitiv hinzufügen, wobei das Tag-Primitiv das Skip-Tag zu allen von diesem Operator ausgegebenen Tupeln hinzufügt und sniff für alle Tupel den Wert true zurückgibt. Das TagSniff-System wäre dann dafür verantwortlich, alle als Skip markierten Tupel aus dem Hauptdatenfluss zu entfernen. Der folgende Codeausschnitt veranschaulicht diese Tag- und Sniff-Funktionen:
Post-hoc-Aussagen
Post-hoc-Assertions sind eine Methode, um zu überprüfen, ob eine bestimmte Bedingung für Eingabe-, Zwischen- oder Ausgabedatensätze erfüllt ist. Diese Technik kann verwendet werden, um Fehler zu identifizieren, die möglicherweise bei der Datenverarbeitung aufgetreten sind. Im obigen Beispiel mit den 100 häufigsten Wörtern kann man beispielsweise Post-hoc-Assertionen verwenden, um zu überprüfen, ob alle Zeichenketten, die als Eingabe an die Map-Funktion übergeben wurden, mindestens die Länge 1 hatten. Dies kann mit TagSniff erreicht werden. Dabei wendet das Tag das Display-Tag auf Tupel an, die diese Bedingung nicht erfüllen, und sniff gibt für alle Tupel, die das Display-Tag enthalten, den Wert true zurück, sodass das System sie dem Benutzer zur weiteren Überprüfung anzeigt.
Dieser Code wendet eine Post-hoc-Assertion auf die Eingabedaten an, um zu überprüfen, ob jede Zeichenfolge in der Eingabe eine Länge von mindestens 2 Zeichen hat. Er fügt jeder Zeichenfolge, die diese Prüfung nicht besteht, das Tag „display“ hinzu und gibt dann mithilfe von sniff den Wert true für alle Tupel zurück, die das „display“ -Tag enthalten, sodass das System sie dem Benutzer zur weiteren Überprüfung anzeigen kann.
Leistungsprofilerstellung
Das ist eine weitere Technik, mit der Engpässe in großen Datenverarbeitungssystemen identifiziert werden können. Bei dieser Technik werden Ausführungsprotokolle analysiert, um den Datenfluss-Fußabdruck anhand verschiedener Leistungskennzahlen wie Latenz und Durchsatz auf Tupel- oder Operatorebene zu verstehen. Nachzügler-Tupel, ein gefährliches Problem bei der Analyse großer Datenmengen, können zu erheblichen Leistungseinbußen führen. Die meisten Datenverarbeitungssysteme, wie Spark, bieten nur Unterstützung bei der Grobüberwachung auf Auftrags- und Mitarbeiterebene. Oft ist es jedoch wichtig zu wissen, wie lange die Verarbeitung der einzelnen Tupel gedauert hat, damit Engpässe identifiziert werden können. TagSniff kann für die Erstellung von Leistungsprofilen verwendet werden, indem ein Ad-hoc-Datenfluss für die Protokolle ausgeführt wird, falls die protokollierten Tupel die richtigen Zeitstempel enthalten. Wenn nicht, könnte man eine selektive Wiedergabe mit der Tag- und Sniff-Methode durchführen. In diesem Fall fügt das Tag dem Tupel vor und nach der Ausführung des Operators einen Zeitstempel hinzu, und Sniff überprüft, ob die Latenz der Tupelverarbeitung über einem bestimmten Schwellenwert liegt. Alternativ könnte ein Benutzer die Assert-Convenience-Methode verwenden, um Nachzügler-Tupel zu identifizieren. Der folgende Codeausschnitt veranschaulicht, wie diese Methode für die Profilerstellung verwendet wird:
Dieser Code wendet eine Post-hoc-Assertion auf den Eingabedatensatz an, um zu überprüfen, ob die Verarbeitungszeit jedes Tupels über einem bestimmten Schwellenwert liegt, um potenzielle Nachzügler-Tupel zu identifizieren. Er liest einen Datensatz aus einer Logdatei mit Hilfe der Leser Klasse, dann gilt die behaupten Methode für den Datensatz, um alle Tupel herauszufiltern, die die angegebene Bedingung nicht erfüllen. In diesem Fall ist die Bedingung, dass der Zeitunterschied zwischen den Zeitstempeln, die im „timestamp“ -Tag jedes Tupels gespeichert sind, größer als ein vordefinierter Schwellenwert ist. Schließlich sammelt es den gefilterten Datensatz und druckt ihn aus.
Zusammenfassung
Zusammenfassend lässt sich sagen, dass das Debuggen von Big-Data-Anwendungen neue Interaktivitätsfunktionen erfordert, die herkömmliche Debugging-Methoden möglicherweise nicht bieten. Das Online-Debugging mit TagSniff bietet eine effiziente Möglichkeit, Big-Data-Anwendungen zu debuggen, während der Job noch ausgeführt wird. Mit TagSniff können Entwickler Daten in verschiedenen Phasen des Datenflusses untersuchen, Absturzverursacher identifizieren und sich benachrichtigen lassen, wenn bestimmte Bedingungen für die Daten erfüllt sind. Das Online-Debugging mit TagSniff bietet eine umfassende und effiziente Möglichkeit, Fehler in Big-Data-Anwendungen zu beheben. In ähnlicher Weise ist das Post-hoc-Debugging ein wichtiger Teil der Datenanalysepipeline, mit dessen Hilfe die zugrunde liegenden Probleme bei der Ausführung des Datenflusses identifiziert werden können. Mithilfe von TagSniff können Benutzer verschiedene Post-hoc-Aufgaben ausführen, z. B. Vorwärts- und Rückwärtsverfolgung, selektive Wiedergabe und Herkunftsinformationen. Insgesamt bietet TagSniff ein leistungsstarkes Framework für die Anwendung dieser Techniken auf verteilte Datenflusssysteme. Mithilfe dieser Techniken können Entwickler und Datenwissenschaftler Einblicke in die Systemleistung gewinnen und Probleme identifizieren, die möglicherweise bei der Datenverarbeitung aufgetreten sind.
Über Scalytics
Apache Wayang: Das führende Java-basierte Federated Learning-Framework
Scalytics nutzt Apache Wayang als Basis, und wir sind stolz darauf, dieses Projekt zu fördern. Sie können das öffentliches GitHub-Repository hier einsehen. Wenn Ihnen unsere Software gefällt, zeigen Sie Ihre Wertschätzung und Unterstützung – ein Stern ⭐ würde uns viel bedeuten!
Wenn Sie professionelle Unterstützung von unserem Team von branchenführenden Experten benötigen, können Sie sich jederzeit an uns über Slack oder E-Mail wenden.