Airflow-Triggerprobleme beheben

Managed Airflow (Gen 3) | Managed Airflow (Gen 2) | Managed Airflow (Legacy Gen 1)

Diese Seite enthält Schritte zur Fehlerbehebung und Informationen zu häufigen Problemen mit dem Airflow-Triggerer.

Blockierende Vorgänge im Trigger

Asynchrone Aufgaben können gelegentlich in Triggerern blockiert werden. In den meisten Fällen werden die Probleme durch unzureichende Triggerer-Ressourcen oder Probleme mit benutzerdefiniertem asynchronem Operatorcode verursacht.

In den Triggerer-Logs werden alle Warnmeldungen angezeigt, die Ihnen helfen können, die Ursachen für eine verringerte Triggerer-Leistung zu ermitteln. Es gibt zwei wichtige Warnungen, auf die Sie achten sollten.

  1. Asynchroner Thread blockiert:

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the
    highly utilized environment.
    

    Diese Warnung weist auf Leistungsprobleme aufgrund einer hohen Anzahl asynchroner Aufgaben hin.

    Lösung: So beheben Sie dieses Problem:

    • Passen Sie die Triggerer-Parameter an, um den Triggerern mehr Ressourcen zuzuweisen oder die Anzahl der Triggerer in Ihrer Umgebung zu erhöhen.
    • Reduzieren Sie die Anzahl der ausgesetzten Aufgaben, die gleichzeitig ausgeführt werden.

    Obwohl Triggerer aussetzbare Aufgaben verarbeiten, sind Airflow-Worker für das Starten und letztendlich für den Abschluss jeder Aufgabe verantwortlich. Wenn Sie die Anzahl der Triggerer anpassen, sollten Sie auch die Anzahl Ihrer Worker-Instanzen skalieren.

  2. Eine bestimmte Aufgabe hat den asynchronen Thread blockiert:

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done,
    defined at /opt/***/***/jobs/example.py:609> result=None> took 0.401
    second
    

    Diese Warnung verweist auf einen bestimmten Operatorcode, der von Managed Service for Apache Airflow ausgeführt wird. Trigger verwenden standardmäßig die asyncio-Bibliothek, um Vorgänge im Hintergrund auszuführen. Eine benutzerdefinierte Implementierung eines Triggers kann die asyncio-Verträge nicht ordnungsgemäß einhalten (z. B. aufgrund einer falschen Verwendung der Schlüsselwörter await und async im Python-Code).

    Lösung: Untersuchen Sie den Code, der in der Warnung angegeben ist, und prüfen Sie, ob der asynchrone Vorgang ordnungsgemäß implementiert ist.

Zu viele Trigger

Die Anzahl der ausgesetzten Aufgaben ist im task_count Messwert sichtbar, der auch im Monitoring-Dashboard Ihrer Umgebung angezeigt wird. Jeder Trigger erstellt einige Ressourcen wie Verbindungen zu externen Ressourcen, die Arbeitsspeicher verbrauchen.

Auf dem Monitoring-Dashboard angezeigte ausgesetzte Tasks
Abbildung 1. Ausgesetzte Aufgaben im Monitoring Dashboard (zum Vergrößern klicken)

Diagramme zum Arbeitsspeicher- und CPU-Verbrauch zeigen, dass unzureichende Ressourcen Neustarts verursachen, weil die Liveness-Probe aufgrund fehlender Heartbeats fehlschlägt:

Triggerer wird aufgrund unzureichender Ressourcen neu gestartet
Abbildung 1. Triggerer-Neustarts aufgrund unzureichender Ressourcen (zum Vergrößern klicken)

Lösung: So beheben Sie dieses Problem:

  • Passen Sie die Triggerer-Parameter an, um den Triggerern mehr Ressourcen zuzuweisen oder die Anzahl der Triggerer in Ihrer Umgebung zu erhöhen.
  • Reduzieren Sie die Anzahl der ausgesetzten Aufgaben, die gleichzeitig ausgeführt werden.

Absturz eines Airflow-Workers während der Callback-Ausführung

Nachdem der Trigger die Ausführung beendet hat, wird die Steuerung an einen Airflow-Worker zurückgegeben, der eine Callback-Methode mit einem Ausführungs-Slot ausführt. Diese Phase wird vom Celery-Executor gesteuert. Daher gelten die entsprechenden Konfigurations- und Ressourcenlimits (z. B. parallelism oder worker_concurrency).

Wenn die Callback-Methode im Airflow-Worker fehlschlägt, der Worker fehlschlägt oder der Worker, der die Methode ausführt, neu gestartet wird, wird die Aufgabe als FAILED markiert. In diesem Fall wird beim Wiederholungsvorgang die gesamte Aufgabe noch einmal ausgeführt, nicht nur die Callback-Methode.

Endlosschleife in einem Trigger

Es ist möglich, einen benutzerdefinierten Trigger-Operator so zu implementieren, dass er die Hauptschleife des Triggerers vollständig blockiert, sodass jeweils nur der eine fehlerhafte Trigger ausgeführt wird. In diesem Fall wird in den Triggerer-Logs eine Warnung generiert, nachdem der problematische Trigger beendet wurde.

Triggerklasse nicht gefunden

Da der Ordner „DAGs“ nicht mit dem Airflow-Triggerer synchronisiert wird, fehlt der Inline-Triggercode, wenn der Trigger ausgeführt wird. Der Fehler wird in den Logs der fehlgeschlagenen Aufgabe generiert:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

Lösung: Importieren Sie den fehlenden Code aus PyPI.

Warnmeldung zum Triggerer in der Airflow-Benutzeroberfläche

In einigen Fällen wird nach dem Deaktivieren des Triggerers möglicherweise die folgende Warnmeldung in der Airflow-Benutzeroberfläche angezeigt.

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

Airflow kann diese Meldung anzeigen, weil unvollständige Trigger in der Airflow-Datenbank verbleiben. Diese Meldung bedeutet in der Regel, dass der Triggerer deaktiviert wurde, bevor alle Trigger in Ihrer Umgebung abgeschlossen waren.

Sie können alle Trigger, die in der Umgebung ausgeführt werden, auf der Seite Browse > Triggers in der Airflow-Benutzeroberfläche ansehen. Die Rolle Admin ist erforderlich.

Lösungen:

Aufgaben bleiben im Status „Ausgesetzt“, nachdem der Triggerer deaktiviert wurde

Wenn der Triggerer deaktiviert ist, bleiben Aufgaben, die sich bereits im Status „Ausgesetzt“ befinden, in diesem Status, bis das Zeitlimit erreicht ist. Dieses Zeitlimit kann je nach Airflow- und DAG-Konfiguration unendlich sein.

Verwenden Sie eine der folgenden Lösungen:

  • Markieren Sie die Aufgaben manuell als fehlgeschlagen.
  • Aktivieren Sie den Triggerer, um die Aufgaben abzuschließen.

Wir empfehlen, den Triggerer nur zu deaktivieren, wenn in Ihrer Umgebung keine ausgesetzten Operatoren oder Aufgaben ausgeführt werden und alle ausgesetzten Aufgaben abgeschlossen sind.

Nächste Schritte