Zum Inhalt springen

FORGE · Technik im Detail

Jede Transformation ist Code mit Version und Test.

Wie FORGE Transformationen als Quelltext mit Version und Tests führt, Abhängigkeiten als Graph baut und jede Ausgabe bis zur Rohzeile zurückverfolgt.

Zwischen der Rohzone und den Objekten der Ontologie liegen Transformationen: bereinigen, vereinheitlichen, verknüpfen, berechnen. In FORGE sind sie Quelltext in einem Repository. Jede hat eine Version, Tests, eine Prüfung vor dem Einsatz und eine Spur, die von jedem Ergebnis zurück zu den Eingaben führt. So ist die Verarbeitung ausgelegt: Sie soll sich wie Software prüfen und wiederholen lassen.

Diese Seite beschreibt die Bauweise des Systems. Gebaut sind der Prototyp von Freigabe und Protokoll und der Demonstrator von KALKÜL; den ganzen Stand finden Sie unter Was heute steht.

Auf dieser Seite
  1. 01Transformationen sind Quelltext
  2. 02Der Graph der Abhängigkeiten
  3. 03Tests und Erwartungen
  4. 04Prüfen vor dem Einsatz
  5. 05Spur von jedem Ergebnis zurück
  6. 06Eckdaten
  7. 07Weiter

Transformationen sind Quelltext

Eine Transformation ist eine Funktion von Eingabe-Datensätzen auf einen Ausgabe-Datensatz. Sie ist in SQL oder in Python geschrieben und deklariert, was sie liest und was sie schreibt. Seiteneffekte hat sie nicht; Wirkungen nach außen gibt es nur über Handlungen. Dieselbe Eingabe und derselbe Code ergeben darum dasselbe Ergebnis.

Der Quelltext liegt in einem Git-Repository. Jede Änderung ist ein Commit mit Autor, Zeit und Begründung. Ein Lauf nennt den Commit, mit dem er gebaut wurde, und die Stände der Eingaben, die er las. Was im Betrieb läuft, ist damit eine bestimmte Version von Code und nicht der Stand, den jemand zuletzt in einer Oberfläche eingestellt hat.

Parameter wie Schwellwerte, Zuordnungstabellen und Umrechnungsfaktoren stehen als versionierte Daten neben dem Code, nicht in ihn eingebettet. Die Änderung eines Schwellwerts ist so eine Änderung im Repository und durchläuft dieselbe Prüfung wie jede andere.

Der Graph der Abhängigkeiten

Aus den deklarierten Ein- und Ausgaben leitet FORGE einen gerichteten Graphen ohne Kreise ab (DAG): Knoten sind Datensätze, Kanten sind Transformationen. Die Reihenfolge der Läufe steht in keinem Zeitplan, sie folgt aus dem Graphen. Ein Kreis wird beim Einchecken abgewiesen und nicht erst zur Laufzeit entdeckt.

Gebaut wird, was veraltet ist. Hat sich eine Eingabe nicht geändert, bleibt die Ausgabe stehen. Ändert sie sich, werden genau die Datensätze neu gebaut, die von ihr abhängen, in der Reihenfolge des Graphen. Das Ende eines Laufs ist ein Commit der Ausgabe: Sie wird als Ganzes sichtbar oder gar nicht, nie halb.

Große Datensätze verarbeitet FORGE inkrementell. Die Transformation sieht nur Zeilen, die seit dem letzten Lauf hinzukamen oder sich änderten, und führt ihren Zustand fort. Derselbe Code kann den ganzen Bestand neu rechnen, etwa nach einem Fehler; beide Wege müssen dasselbe Ergebnis liefern, und ein Test prüft das an einem kleinen Bestand.

Von der Rohzone zur Ontologie

Die Rohzone läuft durch Transformationen in die Ontologie. Eine Änderung weiter vorn baut nur die Datensätze neu, die von ihr abhängen; der Rest bleibt stehen.

Pipeline in FORGE: Rohzone, Bereinigen, Abbilden, Verknüpfen, Berechnen, OntologieDie Rohzone läuft durch Transformationen in die Ontologie. Eine Änderung weiter vorn baut nur die Datensätze neu, die von ihr abhängen; der Rest bleibt stehen.ROHZONEONTOLOGIEBEREINIGENABBILDENVERKNÜPFENBERECHNENOBJEKTE
  • Ablauf von Rohzone bis Ontologie: Bereinigen, Abbilden, Verknüpfen, Berechnen, Objekte.
  • Bereinigen zu Abbilden.
  • Abbilden zu Verknüpfen.
  • Verknüpfen zu Objekte.
  • Abbilden zu Berechnen.
  • Berechnen zu Objekte.
ABLAUF · WEGE OHNE MENGEN

Tests und Erwartungen

Zwei Arten von Prüfung hängen an jeder Transformation. Modultests rufen sie mit kleinen, von Hand geschriebenen Eingaben auf und vergleichen das Ergebnis mit dem erwarteten, einschließlich der Grenzfälle: leere Eingabe, doppelte Schlüssel, fehlende Werte, Wechsel der Zeitzone. Sie laufen bei jedem Commit.

Erwartungen an Daten sind Bedingungen am Ausgabe-Datensatz, die bei jedem Lauf gegen die echten Daten geprüft werden: Schlüssel eindeutig, Pflichtfelder gefüllt, Werte im Bereich, jeder Verweis zeigt auf ein vorhandenes Objekt, die jüngste Zeile ist nicht älter als eine festgelegte Frist. Jede Erwartung ist als Warnung oder als Abbruch eingestuft.

Bricht ein Lauf ab, bleibt die vorige Version der Ausgabe stehen, und alles, was von ihr abhängt, liest weiter den letzten gültigen Stand. Ein Fehler in der Mitte der Kette erzeugt so keine halb gerechneten Objekte.

erwartung  objekt_schluessel
datensatz  objekte_abgebildet
pruefe     schluessel ist eindeutig
           pflichtfelder sind gefüllt
           verweis(zustaendig) zeigt auf ein Objekt
           jüngste_zeile ist nicht älter als frist
bei_bruch  abbruch          ( oder: warnung )
Erwartungen an einen Ausgabe-Datensatz in schematischer Schreibweise. Bei Abbruch bleibt die vorige Version stehen.

Prüfen vor dem Einsatz

Eine Änderung kommt über einen Merge Request in die Hauptlinie. Zuerst laufen die Modultests. Dann baut FORGE die betroffenen Datensätze auf einem Zweig, getrennt vom Betrieb, und vergleicht das Ergebnis mit der Hauptlinie: welche Zeilen hinzukommen, wegfallen oder sich ändern, ob sich das Schema ändert, welche abhängigen Datensätze und Handlungen betroffen sind.

Der Vergleich gehört zur Prüfung durch Menschen. Wer freigibt, sieht nicht nur die Zeilen des Quelltexts, sondern die Wirkung auf die Daten. Wer eine Änderung schreibt, gibt sie nicht selbst frei; das Recht, in die Hauptlinie zu führen, ist ein eigenes Recht.

Erst nach der Freigabe wird die neue Version gebaut. Verletzt sie im ersten Lauf eine Erwartung, bleibt die vorige in Kraft. Eine Rücknahme danach ist das Zurücksetzen des Zeigers auf die vorige Version von Code und Daten.

Von der Änderung zum Einsatz

Unten die Änderung im Repository, darüber die Prüfung mit Tests, Erwartungen und Vergleich. Oben der Einsatz, den erst eine Freigabe öffnet.

Prüfweg in FORGE im Schnitt: Repository, Prüfung, EinsatzUnten die Änderung im Repository, darüber die Prüfung mit Tests, Erwartungen und Vergleich. Oben der Einsatz, den erst eine Freigabe öffnet.EinsatzHAUPTLINIEFREIGABELAUFPrüfungAUF EINEM ZWEIGMODULTESTERWARTUNGVERGLEICHRepositoryMIT VERSIONCOMMITMERGE REQUESTGEPRÜFT
  • Einsatz (Hauptlinie): Freigabe, Lauf.
  • Prüfung (auf einem Zweig): Modultest, Erwartung, Vergleich.
  • Repository (mit Version): Commit, Merge Request.
  • geprüft: fließt von repo nach einsatz.
SCHNITT VON VORN

Spur von jedem Ergebnis zurück

Jede Ausgabe führt den Lauf mit, der sie erzeugte: Commit der Transformation, Stand jeder Eingabe, Zeit und Ergebnis der Erwartungen. Ein Objekt der Ontologie trägt damit nicht nur die Herkunft seiner Werte, also Quelle und Zeile, sondern auch den Weg: welche Transformationen in welcher Version aus der Rohzeile den Wert gemacht haben.

Die Spur ist bis auf die Spalte aufgelöst. Aus der Deklaration der Transformation weiß FORGE, welche Eingabespalten in welche Ausgabespalte einfließen. Ändert sich eine Quellspalte, ist sofort bekannt, welche Eigenschaften, Regeln und Handlungen betroffen sind. Für den Austausch mit anderen Werkzeugen ist OpenLineage vorgesehen.

Findet jemand einen Fehler in einer Transformation, wird sie korrigiert, und die abhängigen Datensätze werden aus der Rohzone neu gebaut. Die Rohzone ist nur anhängend und enthält alles, was je ankam; die Neuberechnung ist deshalb vollständig. Die fehlerhaften Stände bleiben als frühere Erfassungsstände erhalten. Wer eine alte Entscheidung prüft, sieht, was damals gerechnet war.

Eckdaten

Sprachen
SQL und Python; Ein- und Ausgaben deklariert, keine Seiteneffekte
Version
Git; ein Lauf nennt Commit und Stände der Eingaben
Abhängigkeiten
gerichteter Graph ohne Kreise, aus Ein- und Ausgaben abgeleitet
Läufe
nur veraltete Datensätze; inkrementell oder vollständig; Ergebnis ganz oder gar nicht
Tests
Modultests mit kleinen Eingaben; Erwartungen an Ausgaben mit Warnung oder Abbruch
Prüfung
Merge Request, Lauf auf einem Zweig, Vergleich mit der Hauptlinie, Freigabe durch eine zweite Person
Spur
Lauf, Commit, Eingabestände, bis auf die Spalte; Austausch über OpenLineage vorgesehen
Korrektur
Neuberechnung aus der Rohzone; frühere Stände bleiben als Erfassungsstände

Weiter

Welche Umformung läuft bei Ihnen heute als Skript auf einem einzelnen Rechner? Diese bauen wir mit Ihnen als geprüfte Transformation.