Ich erwähnte, dass die Terminplanung die nächste Hürde ist, auf die ich zusteuere.

Additionally schätze ich, hier bin ich und gehe darauf zu

Aber bevor ich darauf eingehe, was passiert ist, möchte ich für jeden, der zum ersten Mal darüber stolpert, einen Kontext geben.

Ich bin ein Systemanalytiker, der sich für den Übergang in die Datentechnik entschieden hat. Anstatt nur Kurse zu belegen und Zertifikate zu sammeln, habe ich beschlossen, zu lernen, indem ich etwas aufbaue und öffentlich darüber schreibe. Jeder Artikel in dieser Reihe dokumentiert etwas, das ich tatsächlich gebaut habe, die Entscheidungen, die ich getroffen habe, die Dinge, die kaputt gegangen sind, und was ich daraus gelernt habe.

Der erste Artikel struggle meine 12-monatige Roadmap für das Selbststudiumwo ich den Plan darlegte, wie ich diesen Übergang angehen würde. Der Zweite struggle ich Ich baue meine erste ETL-Pipeline von Grund auf auf Verwendung der GitHub-API als absoluter Anfänger. Im dritten habe ich dieselbe Pipeline genommen und machte es produktionstauglicher durch Hinzufügen von SQLite-Speicher, Idempotenz-Handhabung und Google Drive-Persistenz, alles innerhalb von Google Colab.

Dieser Artikel ist der vierte. Und es setzt genau dort an, wo das letzte aufgehört hat.

Ich ging davon aus, dass ich die meiste Zeit damit verbringen würde, ein Planungstool auszuwählen und zu konfigurieren. Was ich nicht erwartet hatte, struggle, dass ich mich mit etwas Grundlegenderem befassen musste, bevor ich überhaupt über die Terminplanung nachdenken konnte. Meine Pipeline konnte nicht außerhalb von Google Colab ausgeführt werden. Und bis sich das änderte, konnte mir kein Planer der Welt helfen.

Dies ist die Geschichte dessen, was tatsächlich passiert ist.

Die erste Wand: Meine Pipeline lebte in Colab

Bevor ich überhaupt mit der Planung begann, wollte ich verstehen, was eigentlich nötig wäre, um meine Pipeline automatisch auszuführen. Deshalb habe ich mir meinen Code zum ersten Mal mit dieser Frage im Hinterkopf genauer angesehen.

So sah der Ladebereich aus:

conn = sqlite3.join('/content material/drive/MyDrive/github_repos.db')

Dieser Weg, /content material/drive/MyDrive/existiert nur innerhalb von Google Colab. Es handelt sich um den bereitgestellten Google Drive-Pfad, den Ihnen Colab zur Verfügung stellt, wenn Sie Ihr Drive mit einem Pocket book verbinden. Außerhalb von Colab existiert dieser Pfad nicht. Wenn ein Planer versuchen würde, dieses Skript auszuführen, würde es genau dort abstürzen.

Das Interessante ist, dass mein Code nein hatte google.colab Importe. Keine Colab-spezifischen Bibliotheken. Nur ein fest codierter Pfad, den ich eingegeben hatte, ohne wirklich darüber nachzudenken. Dieser Pfad struggle die Abhängigkeit, nicht der Code.

Das struggle das erste, was ich nicht erwartet hatte. Ich dachte, die Herausforderung würde darin bestehen, ein Planungstool zu erlernen. Stattdessen struggle die erste Lektion, dass meine Umgebung Teil meiner Pipeline struggle und ich es nicht bemerkt hatte.

Die Lösung struggle einfach. Anstatt den Colab-Pfad fest zu codieren, habe ich den Datenbankpfad über eine Umgebungsvariable konfigurierbar gemacht:

import os

DB_PATH = os.environ.get('DB_PATH', 'github_repos.db')
conn = sqlite3.join(DB_PATH)

Jetzt verwendet das Skript den in der Umgebung festgelegten Pfad. Wenn nichts festgelegt ist, wird auf die Erstellung einer lokalen Datei zurückgegriffen github_repos.db Datei im selben Ordner. Eine Änderung und die Pipeline struggle nicht mehr an Colab gebunden.

Zum ersten Mal außerhalb von Colab ausführen

Bevor ich einen Planer einrichtete, wollte ich sicherstellen, dass das Skript tatsächlich eigenständig funktioniert. Additionally habe ich es gespeichert als pipeline.pyerstellt a necessities.txt mit den beiden benötigten Bibliotheken:

requests
pandas

Und habe es von meinem Terminal aus ausgeführt:

Es wurde gedruckt: Pipeline full. Duplicates dealt with.

Und eine Datei namens github_repos.db erschien in meinem Ordner. Dieselbe Pipeline, die ich in Colab ausgeführt hatte, lief jetzt überall als einfaches Python-Skript.

Das schien eine größere Sache zu sein, als ich erwartet hatte. Nicht weil die Änderung komplex struggle, das struggle sie nicht. Sondern weil mir klar wurde, dass ich meine Pipeline als Notizbuch betrachtet hatte, obwohl ich tatsächlich ein Skript hatte, das sich zufällig darin befand.

Auswahl eines Planungstools

Zu diesem Zeitpunkt hatte ich ein eigenständiges Skript. Jetzt brauchte ich etwas, um es nach einem Zeitplan auszuführen.

Ich habe mir ein paar Optionen angesehen. Mit APScheduler können Sie Zeitpläne in Ihrem Python-Code definieren. Dies funktioniert, während eine Sitzung ausgeführt wird, stoppt jedoch, sobald Sie Ihr Terminal schließen. Das ist nicht wirklich eine Planung, das ist nur eine Schleife. Airflow ist der Industriestandard für die Orchestrierung von Pipelines, erfordert jedoch den Betrieb eines Servers, einer Metadatendatenbank und einer Webschnittstelle. Das ist eine Menge Infrastruktur für den Ort, an dem ich mich gerade befinde.

GitHub Actions befanden sich in der Mitte. Es ist kostenlos, läuft auf den Servern von GitHub, der Zeitplan ist im Code definiert und ich muss keine Infrastruktur pflegen. Der Nachteil besteht darin, dass es für CI/CD-Workflows und nicht für die Pipeline-Orchestrierung konzipiert ist und daher Einschränkungen hinsichtlich komplexer Abhängigkeiten und Überwachung aufweist. Aber für eine Pipeline in meinem Stadium ist es eine praktische Wahl.

Ich möchte auch ehrlich sein: Instruments wie Airflow gibt es aus einem bestimmten Grund. Wenn eine Pipeline wächst, wenn Abhängigkeiten zwischen Aufgaben bestehen und Sie Einblick in die ausgeführten und fehlgeschlagenen Aufgaben benötigen, ist eine ordnungsgemäße Orchestrierung erforderlich. GitHub Actions ist das nicht. Aber es ist ein guter erster Schritt, und zu verstehen, warum es begrenzt ist, ist Teil des Verständnisses dafür, was diese ernsthafteren Instruments tatsächlich lösen.

Einrichten von GitHub-Aktionen

GitHub Actions arbeitet mit Workflow-Dateien, bei denen es sich um YAML-Dateien handelt, die Sie in einem bestimmten Ordner in Ihrem Repository ablegen. Die Ordnerstruktur sieht so aus:

github-etl/
├── .github/
│   └── workflows/
│       └── schedule.yml
├── pipeline.py
└── necessities.txt

Hier ist die vollständige Workflow-Datei, die ich erstellt habe:

title: Run ETL Pipeline

on:
  schedule:
    - cron: '0 9 * * *'
  workflow_dispatch:

jobs:
  run-pipeline:
    runs-on: ubuntu-latest

    steps:
      - title: Checkout code
        makes use of: actions/checkout@v4

      - title: Arrange Python
        makes use of: actions/setup-python@v5
        with:
          python-version: '3.11'

      - title: Set up dependencies
        run: pip set up -r necessities.txt

      - title: Run pipeline
        run: python pipeline.py

Lassen Sie mich durchgehen, was jeder Teil tut.

  • cron: '0 9 * * *' ist der tatsächliche Zeitplan. Cron ist ein zeitbasiertes Jobplanungsformat, das es in Unix-Systemen seit Jahrzehnten gibt. Die fünf Werte repräsentieren Minute, Stunde, Tag des Monats, Monat und Wochentag. Additionally 0 9 * * * bedeutet: zur Minute 0 der 9. Stunde, jeden Tag, jeden Monat, jeden Tag der Woche. Mit anderen Worten, jeden Tag 9 Uhr UTC.
  • workflow_dispatch fügt einen manuellen Auslöser hinzu. Das bedeutet, dass Sie den Workflow auch durch Klicken auf eine Schaltfläche in GitHub ausführen können, ohne auf die geplante Zeit warten zu müssen. Dies ist zum Testen nützlich.
  • runs-on: ubuntu-latest weist GitHub an, bei jedem Lauf eine neue Linux-Maschine hochzufahren. Jedes Mal, wenn der Workflow ausgelöst wird, erstellt GitHub eine saubere Umgebung, installiert Ihre Abhängigkeiten, führt Ihr Skript aus und fährt dann alles herunter. Es gibt keinen persistenten Pc, der irgendwo Ihren Code ausführt. Es ist vergänglich.

Die Schritte sind unkompliziert. Checkout ruft Ihren Code aus dem Repository in den Runner ab. Setup Python installiert die von Ihnen angegebene Model. Abhängigkeiten installieren wird ausgeführt pip set up -r necessities.txt. Und dann führt „Run Pipeline“ Ihr Skript aus.

Was geschah, als ich es ausführte?

Nachdem ich die Workflow-Datei auf GitHub übertragen hatte, ging ich in meinem Repository zur Registerkarte „Aktionen“ und löste sie manuell über die Schaltfläche „workflow_dispatch“ aus.

Es lief. Siebenundzwanzig Sekunden vom Begin bis zum Ende. Die Pipeline hat Daten von der GitHub-API abgerufen, transformiert und in SQLite geladen, alles auf einem GitHub-Server, ohne dass ich nach dem Klicken auf die Schaltfläche etwas tun musste.

Ich habe beim ersten Durchlauf eine Warnung erhalten:

Node.js 20 actions are deprecated...

Das lag daran, dass ich ältere Versionen der Checkout- und Setup-Python-Aktionen verwendet hatte. Der Repair wurde aktualisiert actions/checkout@v3 Zu actions/checkout@v4 Und actions/setup-python@v4 Zu actions/setup-python@v5. Danach lief der Workflow sauber.

Was ich tatsächlich gelernt habe

Als ich darauf einging, dachte ich, dass es bei der Terminplanung darum geht, das richtige Werkzeug auszuwählen. Ich stellte fest, dass mich die Terminplanung dazu zwang, über etwas nachzudenken, worüber ich vorher nicht sorgfältig nachgedacht hatte: Portabilität.

Eine Pipeline, die nur in einer bestimmten Umgebung ausgeführt wird, ist keine echte Pipeline. Es ist ein Skript, das an eine Plattform gebunden ist. Um es planbar zu machen, musste man es zunächst portabel machen, und um es portabel zu machen, musste man verstehen, wovon es tatsächlich abhängt.

Der fest codierte Pfad struggle eine Kleinigkeit. Aber als ich es erkannte, änderte sich meine Einstellung zum künftigen Schreiben von Pipeline-Code. Jedes Mal, wenn ich einen Pfad, einen Berechtigungsnachweis oder einen umgebungsspezifischen Wert schreibe, frage ich mich nun, ob das Ding außerhalb des Kontexts, in dem ich baue, existieren wird.

Außerdem habe ich gelernt, dass Planung und Orchestrierung unterschiedliche Probleme sind. GitHub Actions handhabt die Planung intestine. Dinge wie die Wiederholung fehlgeschlagener Ausführungen mit Backoff, die Warnung, wenn etwas schief geht, die Visualisierung von Pipeline-Abhängigkeiten oder die Verwaltung mehrerer voneinander abhängiger Pipelines werden nicht behandelt. Dabei handelt es sich um Orchestrierungsprobleme, für deren Lösung Instruments wie Airflow konzipiert sind.

Ich bin noch nicht da. Aber ich verstehe jetzt, warum diese Instruments auf eine Weise existieren, die ich vorher nicht kannte.

Was kommt als nächstes?

Die Pipeline läuft jetzt jeden Tag um 9 Uhr UTC. Es werden Daten erhoben. Und mir fällt langsam etwas auf: Wenn eine Pipeline täglich läuft, kümmern Sie sich auf andere Weise um die Daten, die sie produziert.

Sind alle Unterlagen sauber? Gibt es Repos, die mit fehlenden Feldern durchschlüpfen? Ist die virale Flagge tatsächlich sinnvoll oder habe ich sie so definiert, dass quick alles „Nein“ lautet?

Das sind Fragen zur Datenqualität. Und sie sind die nächste Wand, auf die ich zugehe.

Dies ist Teil meiner fortlaufenden Serie, die meinen Übergang vom Systemanalytiker zum Dateningenieur dokumentiert. Wenn Sie mitgemacht haben, vielen Dank. Wenn dies Ihr erster Artikel in der Reihe ist, sind die früheren Artikel unten verlinkt.

Vom Datenanalysten zum Dateningenieur: Meine 12-monatige Roadmap zum Selbststudium

Ich habe meine erste ETL-Pipeline als absoluter Anfänger gebaut. Hier erfahren Sie, wie.

Ich dachte, Knowledge Engineering sei nur das Schreiben von Skripten. Ich habe mich geirrt.

Verbinde dich mit mir LinkedIn, YouTubeUnd Twitter.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert