Wir haben Airbnb / Apache Airflow für unseren ETL mit LocalExecutor
eingerichtet. Nachdem wir angefangen haben, komplexere DAGs zu erstellen, haben wir festgestellt, dass Airflow unglaubliche Mengen an Systemressourcen verbraucht. Dies ist für uns überraschend, da wir Airflow hauptsächlich dazu verwenden, Aufgaben auf anderen Servern zu orchestrieren, so dass Airflow-DAGs die meiste Zeit darauf warten, dass sie ausgeführt werden - es gibt keine tatsächliche Ausführung, die lokal passiert.
Das größte Problem ist, dass Airflow zu jeder Zeit 100% der CPU verbraucht (auf einem AWS t2.medium) und mehr als 2 GB Speicher mit den standardmäßigen airflow.cfg-Einstellungen verwendet.
Falls erforderlich, führen wir Airflow mit docker-compose aus, indem Sie den Container zweimal ausführen. einmal als scheduler
und einmal als webserver
.
Was machen wir hier falsch? Ist das normal?
BEARBEITEN:
Hier ist die Ausgabe von htop
, geordnet nach% Speicher verwendet (da das jetzt das Hauptproblem zu sein scheint, habe ich die CPU runter):
Ich nehme an, theoretisch könnte ich die Anzahl der Gunicorn-Arbeiter reduzieren (es ist der Standardwert von 4), aber ich bin mir nicht sicher, was all die /usr/bin/dockerd
Prozesse sind. Wenn Docker Dinge verkompliziert, kann ich sie entfernen, aber die Bereitstellung von Änderungen ist wirklich einfach und ich möchte sie lieber nicht entfernen, wenn es möglich ist.
Ich bin gerade auf ein Problem wie dieses gestoßen. Airflow verbrauchte in einer t2.xlarge-Instanz ungefähr eine vollständige vCPU, wobei der Großteil davon aus dem Scheduler-Container stammte. Beim Überprüfen der Scheduler-Protokolle konnte ich feststellen, dass meine einzelne DAG mehr als einmal pro Sekunde verarbeitet wurde, obwohl sie nur einmal am Tag ausgeführt wurde. Ich fand, dass der MIN_FILE_PROCESS_INTERVAL auf den Standardwert 0 festgelegt war, so dass der Scheduler die DAG durchlaufen hat. Ich habe das Prozessintervall auf 65 Sekunden geändert, und Airflow verwendet jetzt weniger als 10 Prozent einer vCPU in einer t2.medium-Instanz.
Für den Anfang können Sie htop verwenden, um Ihre CPU-Auslastung zu überwachen und zu debuggen.
Ich würde vorschlagen, dass Sie Webserver- und Scheduler-Prozesse auf demselben Andock-Container ausführen, wodurch die Ressourcen reduziert werden, die für die Ausführung von zwei Containern auf einem ec2 t2.medium erforderlich sind. Airflow-Arbeiter benötigen Ressourcen zum Herunterladen und Lesen von Daten im Speicher, aber Webserver und Scheduler sind ziemlich leichte Prozesse. Stellt sicher, dass Sie beim Ausführen des Webservers die Anzahl der Worker steuern, die auf der Instanz mit dem Client ausgeführt werden.
%Vor%Tags und Links docker amazon-ec2 airflow