Debugging ist ein wichtiger Bestandteil der Softwareentwicklung. Einfach ausgedrückt: Es geht darum, Probleme in Computerprogrammen zu finden und zu lösen. Es gibt verschiedene Möglichkeiten zum Debuggen, und alle sind manchmal langwierig und manchmal schmerzhaft — das wissen wir alle. Debuggen ist ein Prozess, den wir als Softwareentwickler durchführen müssen, aber wir lieben ihn kaum.
In einem vorherigen Blog Im Beitrag haben wir auf die Schwierigkeiten beim Debuggen von Big-Data-Anwendungen, die Probleme beim Debugging-Prozess und die vielschichtigen Prozesse hingewiesen, die durch föderiertes Lernen auf mehreren, unabhängigen Datenspeichern entstehen. Heute stellen wir „TagSniff“ vor, eine neue Debugging-Technik, die einfache Instrumentierungsprimitive für das Online- und Post-hoc-Debugging hinzufügt.
TagSniff ist Teil von Blossom Core und wird in unseren kommenden AI Advisor einfließen, einer neuen generativen KI, die beim Debuggen von KI-Pipelines über föderierte Datenspeicher hinweg hilft. Der Blossom Advisory Service erkennt Fehler oder ungültige Datenmodifikatoren, verfolgt sie und meldet die Ergebnisse an die Konsole der Dateningenieure zurück. Während des Vorgangs lernt der Berater und kann Fehler automatisch finden und beheben. Der Dateningenieur hat die Wahl, Vorschläge manuell anzuwenden oder den Berater in eine CI/CD-Pipeline zu integrieren. Der Berater wird in der Lage sein, Pull-Requests zu öffnen und Codeänderungen zur Überprüfung vorzuschlagen. Wir planen, im dritten Quartal 2023 eine erste Codevorschau zu veröffentlichen, aber wir können und werden uns in dieser frühen Entwicklungsphase nicht auf diesen Zeitplan festlegen.
In diesem Blogbeitrag stellen wir TagSniff ausführlicher vor: was es ist, welche Komponenten es hat und wie man es zum Debuggen Ihres Codes verwendet.
Die Idee hinter „TagSniff“
Die Idee hinter TagSniff ist ein Ansatz zur Datenflussinstrumentierung, der aus zwei Grundelementen besteht: Tag und schnüffeln, arbeitet als Debug-Tupel. Ein Debug-Tupel ist eine Datenstruktur, die aus mehreren Teilen besteht und zwischen den Datenoperatoren fließt, wenn das Debuggen aktiviert ist. Das Tag-Primitiv fügt einem Tupel Tags hinzu, während das Sniff-Primitiv anhand ihrer Metadaten oder Werte Tupel identifiziert, die debuggt oder weiter analysiert werden müssen. Das einzigartige Merkmal dieser Primitive besteht darin, dass Benutzer mithilfe benutzerdefinierter Funktionen (UDF) auf einfache Weise benutzerdefinierte Debugging-Funktionen hinzufügen können. Ein TagSniff-System bezieht sich auf jedes System, das dieses abstrakte Debugging-Modell implementiert.
Der Debugging-Objektspeicher
Das Debug-Tupel ist das Tupel, auf dem die TagSniff-Primitiven arbeiten. <tuple>Ein Debug-Tupel besteht aus dem Originaltupel, dem Anmerkungen und/oder Metadaten vorangestellt sind, <|tag1|tag2|..., >. Anmerkungen beschreiben, wie Benutzer erwarten, dass das System reagiert, während Metadaten den Tupeln zusätzliche Informationen hinzufügen, z. B. einen Bezeichner. Die folgende Tabelle zeigt ein Beispiel für eine Reihe von Anmerkungen.
Tags werden entweder von Benutzern oder vom Debugging-System eingefügt und stammen hauptsächlich aus der Datenfluss-Instrumentierung. Die Benutzer können diese Tags manipulieren, um komplexe Debugging-Szenarien wie Lineage zu unterstützen. Um diese Tag-Manipulation zu ermöglichen, bietet TagsNiff die folgenden Methoden für das Debug-Tupel:
- add_tag (Tag: Zeichenfolge)
- get_tag (Tag: Zeichenfolge)
- has_tag (Tag: Zeichenfolge)
- alles holen ()
Die „Tag-and-Sniff“ -Primitive
Das TagSniff-Modell bietet zwei Primitive, Tag und Sniff, um das Debug-Tupel zu instrumentieren. Das Tag-Primitiv wird zum Hinzufügen von Tags zu einem Tupel verwendet. Die Eingabe ist ein UDF, das ein Tupel empfängt und ein neues Tupel mit allen neuen Tags ausgibt, die Benutzer anhängen möchten. Das Sniff-Primitiv wird zur Identifizierung von Tupeln verwendet, die anhand ihrer Metadaten oder Werte debuggt oder weiter analysiert werden müssen. Die Eingabe ist ein UDF, das ein Tupel empfängt und je nachdem, ob der Benutzer dieses Tupel analysieren möchte oder nicht, wahr oder falsch ausgibt. Schauen wir uns zwei spezifische Debugging-Aufgaben an, die mit „TagSniff“ implementiert werden können, ohne dass viel Boilerplate-Code erforderlich ist.
Beispiel 1: Datenhaltepunkt
Angenommen, Sie möchten einen Datenhaltepunkt in einem Spark-Programm hinzufügen, das die 100 häufigsten Wörter abruft. Sie möchten die Ausführung des Programms immer dann unterbrechen, wenn es auf ein Tupel mit einem Nullwert stößt, damit Sie es genauer untersuchen können. So können Sie dies mit den Primitiven Tag und Sniff erreichen:
Im obigen Code ist der Tag primitive fügt jedem Tupel, das einen Nullwert enthält, ein „Pause“ -Tag hinzu, während das schnüffeln primitive prüft, ob ein Tupel das „Pause“ -Tag hat und kehrt zurück wahr falls ja, mit Angabe, dass die Ausführung des Programms zu diesem Zeitpunkt unterbrochen werden sollte.
Beispiel 2: Log
Angenommen, Sie möchten jedes Tupel protokollieren, das einen Nullwert enthält, damit Sie es später für die Ablaufverfolgung verwenden können. Sie müssen für jedes Tupel einen eindeutigen Bezeichner generieren und ihn zu den Tupel-Metadaten hinzufügen. So können Sie dies mithilfe der Tag- und Sniff-Primitive erreichen:
Im obigen Code ist der Tag primitive generiert einen eindeutigen Bezeichner für jedes Tupel, das einen Nullwert enthält, und fügt ihn zusammen mit einem „log“ -Tag zu den Metadaten des Tupels hinzu. Das schnüffeln primitive prüft, ob ein Tupel das „log“ -Tag hat und gibt zurück wahr wenn ja, bedeutet dies, dass das Tupel protokolliert werden soll.
TagSniff auf den Punkt
Es ist erwähnenswert, dass „TagSniff“ so einfach wie möglich gestaltet wurde und nur mit der Tupelgranularität definiert ist. Sie fragen sich jedoch vielleicht, wie Sie „TagSniff“ für eine Reihe von Tupeln verwenden können. Ein Ansatz besteht darin, den zu verwenden Tag primitiv, um einem Tupel ein Tag hinzuzufügen, das seine Zugehörigkeit zu einer Menge angibt, und dann das schnüffeln primitiv, um pro Tupel nach dem Vorhandensein dieses Tags zu suchen. Da das Modell nur zwei Primitive, Tag und Sniff, bereitstellt, lassen sich allgemeine Debugging-Aufgaben einfach zusammenstellen und benutzerdefinierte Debugging-Aufgaben ermöglichen. Sein Hauptvorteil ist insbesondere seine Flexibilität bei der einfachen und effektiven Unterstützung der meisten Online- und Post-hoc-Debugging-Aufgaben. Wir werden diese beiden Daten-Debugging-Modi im folgenden Blogbeitrag veranschaulichen. Darüber hinaus können Benutzer mithilfe benutzerdefinierter Funktionen problemlos benutzerdefinierte Debugging-Funktionen hinzufügen, was die Flexibilität des Modells erhöht.
Insgesamt bietet das TagSniff-Modell eine leistungsstarke Abstraktion für das Datendebugging, die in einer Vielzahl von Kontexten verwendet werden kann und die Menge an Boilerplate-Code, der für Debugging-Aufgaben erforderlich ist, erheblich reduzieren kann.
Ü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.