Direkt zum Inhalt

Wie löse ich "psycopg2.OperationalError: SSL connection has been closed unexpectedly error" in Amazon MWAA?

Lesedauer: 6 Minute
0

Ich möchte den Fehler "psycopg2.OperationalError: SSL connection has been closed unexpectedly" in Amazon Managed Workflows für Apache Airflow (Amazon MWAA) beheben.

Kurzbeschreibung

Wenn du den Directed Acyclic Graph (DAG) ausführst und eine Aufgabe fehlschlägt, erhältst du möglicherweise die folgenden Fehlermeldungen im Aufgabenprotokoll:

  • "psycopg2.OperationalError: SSL connection has been closed unexpectedly".
  • "sqlalchemy.exc.OperationalError: (psycopg2.errors.ConnectionException) Timed-out waiting to acquire database connection".

Die vorherigen Fehlermeldungen treten auf, wenn der Worker die Metadaten-Datenbank überlastet oder die Verbindung zur Metadaten-Datenbank verliert oder die Aufgabe versucht, eine geschlossene Datenbankverbindung wiederzuverwenden.

Gehe wie folgt vor, um dieses Problem zu beheben:

  • Reduziere die CPU- und Speicherauslastung.
  • Prüfe die Konfigurationen der Worker.
  • Verwende aufschiebbare Operatoren.
  • Entferne den Code der obersten Ebene.
  • Verwende keine Apache Airflow-Variablen.
  • Vereinfache die DAG.
  • Erstelle eine .airflowignore-Datei und füge sie dem DAG-Hauptordner in Amazon Simple Storage Service (Amazon S3) hinzu.

Lösung

Die CPU- und Speicherauslastung reduzieren

Ein überlasteter Scheduler, Worker oder Webserver kann möglicherweise keine aktiven Datenbankverbindungen aufrechterhalten. Das Standard-Timeout bei inaktiven Verbindungen für den Amazon Relational Database Service (Amazon RDS) für Apache Airflow-Metadaten beträgt 30 Minuten. Wenn eine Aufgabe oder ein Prozess länger als diesen Zeitraum inaktiv ist oder nicht reagiert, schließt die Datenbank möglicherweise die Verbindung. Weitere Informationen findest du unter IdleClientTimeout.

Gehe wie folgt vor, um die Metriken zur CPU- und Speicherauslastung zu überprüfen:

  1. Öffne die Amazon-CloudWatch-Konsole.
  2. Wähle den AWS/MWAA-Namespace aus.
  3. Wähle auf der Registerkarte Alle Metriken die Option Cluster aus.
  4. Wähle CPUUtilization und wählen dann Alle Suchergebnisse grafisch darstellen aus.
  5. Wähle die Registerkarte Graphisch dargestellte Metriken aus, um Leistungsmetriken anzuzeigen.
  6. Wiederhole die Schritte 1–3 und wähle dann MemoryUtilisation.
  7. Wähle Alle Suchergebnisse grafisch darstellen und dann die Registerkarte Graphisch dargestellte Metriken aus, um Leistungsmetriken anzuzeigen.
    Hinweis: Du musst Maximum für Statistik und 1 Minute für Zeitraum auswählen.

Weitere Informationen findest du unter Container-, Warteschlangen- und Datenbankmetriken für Amazon MWAA.

Wenn die CPU- und Speicherauslastung der Worker konstant über 90 % liegt, sind die Worker überlastet oder die Aufgaben sind zu schwer. Eine hohe CPU- und Speicherauslastung kann zu Problemen mit Aufgabenstatusberichten, der Metadaten-Datenbankkommunikation und neuen Aufgaben führen.

Gehe wie folgt vor, um die CPU- und Speicherauslastung der Worker zu reduzieren:

  • Da Worker in den ersten Phasen der Aufgabenerstellung mehr Ressourcen benötigen, solltest du deine Aufgabenpläne verteilen.
  • Beschränke die Importe auf Aufgaben, für die sie erforderlich sind und entferne globale Importe, die nicht erforderlich sind.
  • Verwende Apache Airflow und Amazon MWAA als die wichtigsten Tools. Plane die verbleibenden Aufgaben für Services wie Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) oder AWS Glue.
    Hinweis: Verarbeite keine großen Datenmengen über Worker, da diese nur über begrenzte Ressourcen verfügen. Verwende Services, die für die Verarbeitung großer Datenmengen konzipiert sind.
  • Reduziere die Daten, die zwischen Aufgaben weitergegeben werden. Wenn möglich, teile die Daten so auf, dass sich die Downstream-Daten nicht aufgrund überlasteter Amazon MWAA-Workloads ändern.
    Hinweis: Wenn du große Datenmengen zwischen Aufgaben weitergeben musst, speichere die Daten extern und importiere sie nach Bedarf. Einige Operatoren verwenden XCOMs. Weitere Informationen findest du unter XComs auf der Apache Airflow-Website.
  • Reinige die Metadaten-Datenbank regelmäßig.
    Hinweis: Eine hohe CPU-Auslastung oder wenig freier Speicher können dazu führen, dass Abfragen fehlschlagen oder die Latenz erhöht wird, was zu einem SSL-Ausnahmefehler führt.

Hinweis: Wenn du die CPU nicht reduzieren kannst, verwende eine größere Umgebungsklasse mit mehr Ressourcen für die Worker oder optimiere die Worker weiter.

Die Konfigurationen der Worker überprüfen

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Jede Apache Airflow-Version hat Standardwerte für Worker-Konfigurationen. Möglicherweise musst du die Konfigurationen jedoch an die Anforderungen anpassen.

Die Apache Airflow-Konfigurationen einstellen

Verwende die Amazon MWAA-Konsole, den AWS-CLI-Befehl update-environment oder einen UpdateEnvironment-API-Aufruf, um die folgenden Konfigurationen anzupassen:

  • Die Konfiguration celery.worker_autoscale steuert die maximale und minimale Anzahl von Aufgaben, die gleichzeitig auf einem Worker ausgeführt werden können. Reduziere die maximale Anzahl von Datenbankverbindungen vom Worker aus. Weise dann für jede Aufgabe mehr Ressourcen für eine geringere Anzahl von Aufgaben mit denselben Arbeitsressourcen zu.
  • Setze core.execute_tasks_new_python_interpreter auf Wahr, um für jede Aufgabe einen neuen Python-Interpreter zu erstellen und die Datenbankkonnektivität zu isolieren.
    Hinweis: Setze die Konfiguration nur auf Wahr, wenn der Fehler "psycopg2.OperationalError" erneut auftritt.
  • Verwende die Auto Scaling-Funktion in Amazon MWAA, um die maximale Anzahl von Workern zu erhöhen.
    Hinweis: Stelle sowohl die Werte max-workers als auch celery.worker_autoscale so ein, dass sie der Workload entsprechen.

Weitere Informationen findest du unter Verwenden der Apache Airflow-Konfigurationsoptionen auf Amazon MWAA.

Die Worker-, Scheduler- und Webserver-Protokolle überprüfen

In Produktionsumgebungen verbraucht die ausführliche Protokollierung unnötige Ressourcen und erhöht die CPU-Auslastung. Es hat sich bewährt, Worker-, Scheduler- und Webserver-Protokoll mindestens auf WARNUNG zu setzen. In den meisten Fällen sind INFO-Protokolle nicht erforderlich.

Aufschiebbare Operatoren verwenden

Verwende aufschiebbare Operatoren, wenn die Aufgaben Aufträge an externe Systeme oder Services senden und auf Ereignisse warten, z. B. die Erstellung eines EMR-Clusters. Aufschiebbare Operatoren geben Worker-Slots frei und erhöhen die Workload-Kapazität. Weitere Informationen findest du auf der Apache Airflow-Website unter Aufschiebbare Operatoren und Trigger.

Den Code der obersten Ebene entfernen

Entferne den Code der obersten Ebene, der unnötige Ressourcen verbraucht, aus dem Scheduler. Passe außerdem die Konfiguration dag_processor.min_file_process_interval für den Anwendungsfall an. Weitere Informationen findest du unter min_file_process_interval und Bewährte Methoden auf der Apache Airflow-Website.

Keine Apache Airflow-Variablen verwenden

Verwende keine Apache Airflow-Variablen im Python-Code der obersten Ebene. Wenn du Variablen abrufst, musst du die Datenbank abfragen und die Abfrage erfolgt in jeder Parsing-Schleife.

Hinweis: Wenn du Variablen verwenden musst, verwende das Variablen-Caching. Weitere Informationen findest du unter use_cache auf der Apache Airflow-Website.

Die DAG vereinfachen

Vereinfache die DAG und teste den Code der DAG für die spezifische Python-Version der Amazon MWAA-Umgebung.

Verwende bei Bedarf eine dynamische Aufgabenzuweisung. Weitere Informationen findest du unter Dynamische Aufgabenzuweisung auf der Apache Airflow-Website.

Eine .airflowignore-Datei und füge sie dem DAG-Hauptordner in Amazon S3 hinzufügen

Der Apache Airflow-Scheduler synchronisiert den Inhalt des DAG-Ordners von Amazon S3 mit jedem Worker. Der Scheduler analysiert außerdem regelmäßig die Dateien in Amazon S3, um die Benutzeroberfläche zu aktualisieren. Beim Analysieren führt der Scheduler die Dateien aus und generiert die DAGs.

Verwende die Datei .airflowignore, um die Ordner und Dateien aus dem DAG-Ordner in Amazon S3 anzugeben. Du musst Regex- und Glob-Muster verwenden. Ignoriere die Nicht-DAG-Dateien während des Analysevorgangs, um die Scheduler-Last auf dem Scheduler zu reduzieren und die DAG-Effizienz zu verbessern. Weitere Informationen findest du unter .airfowignore auf der Apache Airflow-Website.