Pipeline-Läufe planen und protokollieren
Führen Sie Ihre Pipeline als Python-Skript über die Kommandozeile aus, protokollieren Sie Start- und Endzeiten und verwenden Sie cron oder einen Scheduler zur Automatisierung.
Pipeline-Läufe planen und protokollieren ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Vom Notebook zum Skript
Eine Pipeline, die nur ausgeführt wird, wenn eine Entwicklerin oder ein Entwickler manuell ein Notebook öffnet, bietet über den ersten Lauf hinaus keinen geschäftlichen Nutzen. Damit sie täglich automatisch ausgeführt werden kann, muss die Pipeline als über die Kommandozeile ausführbares Python-Skript strukturiert sein: python pipeline.py. Dafür sind ein if __name__ == '__main__':-Einstiegspunkt, das Parsen von Kommandozeilenargumenten und eine korrekte Protokollierung erforderlich – die drei Säulen eines produktionsreifen Skripts.
# pipeline.py
import argparse
import logging
import pandas as pd
def main(config_path):
logging.info(f'Starting pipeline with config: {config_path}')
# ... run ETL steps ...
logging.info('Pipeline complete.')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--config', default='config.json')
args = parser.parse_args()
main(args.config)Konfigurieren der Python-Protokollierung
Das integrierte Python-Modul logging ist das richtige Werkzeug für Pipeline-Protokolle – nicht print()-Anweisungen. Konfigurieren Sie mit logging.basicConfig() einen Logger sowohl für die Ausgabe auf der Konsole als auch in eine Datei. Protokollieren Sie den normalen Fortschritt auf der Ebene INFO und Fehler auf der Ebene ERROR. Dateibasierte Protokolle bleiben nach dem Beenden des Prozesses erhalten, was für die Fehlersuche bei geplanten Ausführungen, die niemand überwacht hat, unerlässlich ist.
import logging
from datetime import date
log_file = f'pipeline_{date.today()}.log'
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
handlers=[
logging.FileHandler(log_file),
logging.StreamHandler()
]
)
logging.info('Logger configured.')Start und Ende der Pipeline protokollieren
Protokollieren Sie immer die Startzeit, die Endzeit und die verstrichene Zeit einer Pipeline-Ausführung. Dadurch entsteht eine Vergleichsbasis: Wenn die Pipeline normalerweise 45 Sekunden läuft, heute aber 8 Minuten benötigt, hat sich etwas geändert – vielleicht ist die Eingabedatei zehnmal größer oder eine Datenbankabfrage läuft langsam. Zeitgestempelte Einträge für Start und Ende machen diesen Vergleich allein anhand der Protokolldatei trivial.
import time
import logging
def run_pipeline(config):
start = time.time()
logging.info(f'Pipeline START | env={config.get("env", "dev")} | input={config["input_path"]}')
try:
df = extract(config)
df_clean = transform(df, config)
load(df_clean, config)
elapsed = time.time() - start
logging.info(f'Pipeline SUCCESS | rows={len(df_clean)} | elapsed={elapsed:.1f}s')
except Exception as e:
logging.error(f'Pipeline FAILED | error={e}', exc_info=True)
raiseZeilenanzahlen pro Schritt protokollieren
Protokollieren Sie die Zeilenanzahl beim Eintritt in und beim Verlassen jedes Transformationsschritts. Ein übersichtliches Protokoll sieht beispielsweise so aus: extract: 50,000 rows → drop_nulls: 49,200 rows → filter: 47,800 rows → output: 47,800 rows. Anhand dieser Spur ist sofort ersichtlich, wie viele Zeilen in jedem Schritt entfernt wurden und ob die Zahlen erwartungsgemäß sind. Auffällige Verluste zeigen sich als Lücken zwischen den protokollierten Anzahlen.
def log_step(df, step_name):
logging.info(f'{step_name}: {len(df):,} rows')
return df
import pandas as pd
df = (pd.read_csv('orders.csv')
.pipe(log_step, 'extract')
.dropna(subset=['revenue'])
.pipe(log_step, 'drop_nulls')
.query('quantity > 0')
.pipe(log_step, 'filter_qty')
)
print('Step logging complete.')Planung mit cron unter Linux/Mac
cron ist der standardmäßige Unix-Scheduler für wiederkehrende Aufgaben. Bearbeiten Sie die Crontab mit crontab -e und fügen Sie eine Zeile hinzu, die den Ausführungszeitpunkt des Skripts festlegt. Das Format lautet: minute hour day month weekday command. Eine Pipeline, die täglich um 6:00 Uhr ausgeführt werden muss, verwendet 0 6 * * * /usr/bin/python /path/to/pipeline.py. Verwenden Sie in cron-Einträgen immer absolute Pfade, da cron in einer minimierten Umgebung ohne die PATH-Einstellungen Ihrer Shell ausgeführt wird.
# crontab entry — edit with: crontab -e
# Run pipeline.py at 06:00 every day
# 0 6 * * * /opt/homebrew/bin/python /Users/analyst/pipeline.py --config /Users/analyst/config.json >> /Users/analyst/cron.log 2>&1
# Common cron patterns:
# 0 6 * * * — daily at 06:00
# 0 */4 * * * — every 4 hours
# 0 9 * * 1 — every Monday at 09:00
print('Cron schedule format: minute hour day month weekday')Planung mit der Python-Bibliothek schedule
Die Bibliothek schedule bietet eine auf reinem Python basierende Möglichkeit, Aufgaben in festgelegten Intervallen auszuführen, ohne cron zu verwenden. Sie ist nützlich in Umgebungen, in denen cron nicht verfügbar ist (Windows), oder wenn die Scheduler-Logik direkt im Python-Prozess enthalten sein soll. Verpacken Sie die Pipeline in eine geplante Aufgabenschleife und lassen Sie den Prozess aktiv, damit er die Aufgabe wiederholt ausführt.
# pip install schedule
# import schedule, time
# def job():
# logging.info('Scheduled run starting...')
# run_pipeline(CONFIG)
# schedule.every().day.at('06:00').do(job)
# schedule.every(4).hours.do(job)
# while True:
# schedule.run_pending()
# time.sleep(60)
print('schedule library: use for in-process Python scheduling')Fehlerbehandlung und Exit-Codes
Ein Pipeline-Skript sollte bei einem Fehler einen Exit-Code ungleich null zurückgeben, damit der Scheduler weiß, dass die Aufgabe fehlgeschlagen ist. Verpacken Sie die Hauptausführung in einen try/except-Block und rufen Sie bei einem Fehler sys.exit(1) auf. cron, Jenkins und Airflow prüfen den Exit-Code: Ein Wert ungleich null löst eine Warnung, eine erneute Ausführung oder eine Benachrichtigung aus. Eine unbehandelte Ausnahme, die den Exit-Code nicht setzt, kann von der automatisierten Überwachung unbemerkt bleiben.
import sys
def main():
try:
run_pipeline(CONFIG)
sys.exit(0) # success
except AssertionError as e:
logging.error(f'Data validation failed: {e}')
sys.exit(2) # data error
except Exception as e:
logging.error(f'Unexpected error: {e}', exc_info=True)
sys.exit(1) # general failure
print('Exit code 0=success, 1=error, 2=data failure')Schreiben einer Zusammenfassungsdatei zur Pipeline-Ausführung
Schreiben Sie nach einer erfolgreichen Ausführung eine kleine JSON-Zusammenfassungsdatei neben die Ausgabe. Fügen Sie den Zeitstempel der Ausführung, die Anzahl der Eingabezeilen, die Anzahl der Ausgabezeilen, die Anzahl der entfernten Zeilen und die verstrichene Zeit hinzu. Überwachungssysteme und Dashboards können diese Datei lesen, um Trends beim Zustand der Pipeline im Zeitverlauf zu verfolgen. Ein Dashboard mit den Ausgabezeilen der letzten 30 Tage macht es leicht, den Tag zu erkennen, an dem eine Datenquelle begonnen hat, weniger Datensätze zu liefern.
import json
from datetime import datetime
def write_run_summary(config, input_rows, output_rows, elapsed):
summary = {
'run_at': datetime.now().isoformat(),
'input_path': config['input_path'],
'input_rows': input_rows,
'output_rows': output_rows,
'rows_dropped': input_rows - output_rows,
'elapsed_seconds': round(elapsed, 2),
'status': 'success'
}
with open('last_run_summary.json', 'w') as f:
json.dump(summary, f, indent=2)
print('Run summary written.')Idempotente Planung: Doppelte Ausführungen vermeiden
Wenn eine geplante Pipeline versehentlich zweimal ausgelöst wird, darf sie die Ausgabe nicht beschädigen. Gestalten Sie den Ladeschritt idempotent: Verwenden Sie einen datierten Dateinamen für die Ausgabe oder überschreiben Sie dieselbe Ausgabe mit dem neuesten Ergebnis. Verwenden Sie beim Laden in eine Datenbank if_exists='replace' oder ein UPSERT-Muster. Verwenden Sie niemals den Modus append ohne einen Schritt zur Duplikatbereinigung, da sonst jede geplante Ausführung der Ausgabetabelle doppelte Zeilen hinzufügt.
from datetime import date
def load_idempotent(df, config):
# Date-stamped output: each run overwrites its own day's file
output_path = f"output_{date.today().strftime('%Y%m%d')}.parquet"
df.to_parquet(output_path, index=False)
logging.info(f'Loaded {len(df)} rows to {output_path}')Bei Pipeline-Fehlern alarmieren
Bei Pipelines, von denen Geschäftsprozesse abhängen, ist Stille nach einem Fehler gefährlich. Richten Sie einen einfachen Alarm ein: Wenn die Datei mit der Laufzusammenfassung nicht innerhalb des erwarteten Zeitfensters aktualisiert wird, senden Sie eine E-Mail oder Slack-Nachricht. Mit Pythons smtplib können Sie bei einem Fehler eine E-Mail senden oder einen Webhook verwenden, um eine Nachricht in Slack zu veröffentlichen. Lösen Sie bei den Exit-Codes 1 oder 2 sofort einen Alarm aus, damit die Analystin oder der Analyst weiß, dass die tägliche Aktualisierung fehlgeschlagen ist, bevor es das Unternehmen bemerkt.
import smtplib
def send_failure_alert(error_msg):
# Example: send plain-text email via SMTP
# server = smtplib.SMTP('smtp.example.com', 587)
# server.sendmail('pipeline@company.com',
# 'analyst@company.com',
# f'Subject: Pipeline Failed\n\n{error_msg}')
# server.quit()
print(f'[ALERT] Would send failure notification: {error_msg}')
# In main():
# except Exception as e:
# send_failure_alert(str(e))
# sys.exit(1)
print('Alert integration pattern shown above.')Vollständiges Skript für eine geplante Pipeline
Führen Sie alle Bestandteile zusammen — Argumentverarbeitung, Logging-Konfiguration, Laufzusammenfassung, Fehlerbehandlung und Exit-Codes — und erstellen Sie ein vollständiges Pipeline-Skript. Dieses Skript kann in jede Umgebung übernommen, auf eine Konfigurationsdatei verwiesen und mit cron oder einem beliebigen Workflow-Orchestrator eingeplant werden. Bei jeder Ausführung erstellt es eine datierte Logdatei, eine Laufzusammenfassung und eine datierte Ausgabedatei. Dadurch ist jeder Lauf vollständig prüfbar und unabhängig reproduzierbar.
# Full script skeleton:
# 1. parse --config argument
# 2. configure logging to file + console
# 3. load JSON config
# 4. validate config
# 5. run extract() -> transform() -> load()
# 6. write run summary JSON
# 7. sys.exit(0) on success, sys.exit(1) on failure
print('Production pipeline script structure complete.')
print('Schedule with: crontab -e or python scheduler.py')Kurzer Test
Testen Sie Ihr Verständnis der Data-Analysis-Konzepte aus dieser Lektion.
Zusammenfassung der Lektion
In dieser Lektion haben Sie Folgendes gelernt: eine Pipeline als Befehlszeilenskript mit Argumentverarbeitung und Logging zu strukturieren, sie mit cron einzuplanen und Fehler mithilfe von Exit-Codes ungleich null und Alarmen zu behandeln sowie Laufzusammenfassungen zu schreiben und idempotente Ladeschritte für zuverlässige automatisierte Ausführungen zu entwerfen. Herzlichen Glückwunsch zum Abschluss des Data-Analysis: Pandas und NumPy-Tracks!
Lerne Python mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 30
- Lektionen
- 120
Häufig gestellte Fragen
Ist die Lektion „Pipeline-Läufe planen und protokollieren“ kostenlos?
Ja — der vollständige Text von „Pipeline-Läufe planen und protokollieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Pipeline-Läufe planen und protokollieren“?
Führen Sie Ihre Pipeline als Python-Skript über die Kommandozeile aus, protokollieren Sie Start- und Endzeiten und verwenden Sie cron oder einen Scheduler zur Automatisierung. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?
Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Pipeline-Läufe planen und protokollieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?
Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Transformationsschritte als Funktionen strukturieren
- Pipelines mit Config-Dicts parametrisieren
- Pipelineschritte mit Assertions testen
- Pipeline-Läufe planen und protokollieren