Einstellung bis s3 für die Protokolle in den Luftstrom
Ich bin mit docker-verfassen einrichten einer skalierbaren Luftstrom cluster. Ich basiert mein Ansatz, die außerhalb dieser Dockerfile https://hub.docker.com/r/puckel/docker-airflow/
Mein problem ist immer die Protokolle einrichten zu schreiben/Lesen von s3. Wenn einer dag abgeschlossen hat, bekomme ich eine Fehlermeldung wie diese
*** Log file isn't local.
*** Fetching here: http://ea43d4d49f35:8793/log/xxxxxxx/2017-06-26T11:00:00
*** Failed to fetch log file from worker.
*** Reading remote logs...
Could not read logs from s3://buckets/xxxxxxx/airflow/logs/xxxxxxx/2017-06-
26T11:00:00
Richte ich eine neue Rubrik in der airflow.cfg
- Datei wie folgt
[MyS3Conn]
aws_access_key_id = xxxxxxx
aws_secret_access_key = xxxxxxx
aws_default_region = xxxxxxx
Dann angegeben das s3 Weg in die remote-Protokolle Abschnitt in airflow.cfg
remote_base_log_folder = s3://buckets/xxxx/airflow/logs
remote_log_conn_id = MyS3Conn
Habe ich diese richtig und es gibt einen bug? Gibt es ein Rezept für Erfolg, das ich hier vermisst werde?
-- Update
Ich habe versucht den Export in URI-und JSON-Formate und weder schien zu funktionieren. Ich habe dann exportiert die aws_access_key_id und aws_secret_access_key und dann den Luftstrom begann, hob es. Jetzt bekomme ich seine Fehler in der Arbeiter-Protokolle
6/30/2017 6:05:59 PMINFO:root:Using connection to: s3
6/30/2017 6:06:00 PMERROR:root:Could not read logs from s3://buckets/xxxxxx/airflow/logs/xxxxx/2017-06-30T23:45:00
6/30/2017 6:06:00 PMERROR:root:Could not write logs to s3://buckets/xxxxxx/airflow/logs/xxxxx/2017-06-30T23:45:00
6/30/2017 6:06:00 PMLogging into: /usr/local/airflow/logs/xxxxx/2017-06-30T23:45:00
-- Update
Ich diesen link gefunden, wie gut
https://www.mail-archive.com/[email protected]/msg00462.html
Habe ich dann geschält in einer meiner Arbeiter Maschinen (getrennt vom webserver und der scheduler) und lief dieses Stück code in python
import airflow
s3 = airflow.hooks.S3Hook('s3_conn')
s3.load_string('test', airflow.conf.get('core', 'remote_base_log_folder'))
Ich diese Fehlermeldung erhalten.
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden
Habe ich versucht zu exportieren verschiedene Arten von AIRFLOW_CONN_
envs wie hier beschrieben im Abschnitt verbindungen https://airflow.incubator.apache.org/concepts.html und von anderen Antworten auf diese Frage.
s3://<AWS_ACCESS_KEY_ID>:<AWS_SECRET_ACCESS_KEY>@S3
{"aws_account_id":"<xxxxx>","role_arn":"arn:aws:iam::<xxxx>:role/<xxxxx>"}
{"aws_access_key_id":"<xxxxx>","aws_secret_access_key":"<xxxxx>"}
Habe ich auch exportiert AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY ohne Erfolg.
Diese Anmeldeinformationen werden in einer Datenbank gespeichert, so dass, sobald ich fügen Sie Sie in der Benutzeroberfläche Sie sollten abgeholt werden, von den Arbeitnehmern, aber Sie sind nicht in der Lage zu schreiben/Lesen die logs aus irgendeinem Grund.
- An dieser Stelle nehme ich keine Strategie um die Protokollierung zu arbeiten. Ich kann nicht bekommen Sie vor Ort, s3, oder mit rfs
- Hat der Ordner 'logs', existieren auf den Weg? Zumindest die lokalen log-Dateien sollte ohne Probleme funktioniert, wenn der Ordner vorhanden ist. Wenn Sie nicht arbeiten, auch lokal, die einzige andere Grund, warum ich denken kann, ist falsche Berechtigungen auf den Luftstrom Ordner.
- Vielleicht haben wir hier etwas.github.com/puckel/docker-airflow/pull/100
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zum einrichten der s3-Verbindung durch den Luftstrom UI. Für diese, müssen Sie gehen Sie auf die Admin -> Registerkarte "Verbindungen" auf den Luftstrom UI und erstellen Sie eine neue Zeile für Ihre S3-Verbindung.
Eine Beispiel-Konfiguration wäre:
aws configure
setup durchgeführt. Bekommen, dass Arbeit würde bedeuten, änderung der s3-Haken, obwohl, wahrscheinlich nicht Wert. boto3.readthedocs.io/de/latest/guide/...Failed to create record. Incorrect padding
login
und "aws_secret_access_key" alspassword
von der Verbindung, so kommt es verschlüsselt Ihre Fernet-Taste.UPDATE Luftstrom 1.10 erleichtert die Protokollierung des viel einfacher ist.
Zur s3-logging stellen Sie die Verbindung Haken als pro die obige Antwort
und dann einfach fügen Sie den folgenden, um den Luftstrom.cfg
Für gcs Protokollierung,
Installieren Sie die gcp_api Paket zuerst, etwa so: pip install apache-Volumenstrom[gcp_api].
Einrichten der Verbindung Haken als pro die obige Antwort
Fügen Sie den folgenden, um den Luftstrom.cfg
HINWEIS: Da der Luftstrom 1.9 remote-logging wurde deutlich verändert. Wenn Sie mit 1.9, Lesen Sie weiter.
Referenz hier
Vollständige Anleitung:
Erstellen Sie ein Verzeichnis zum speichern von Konfigurationen und platzieren Sie dieses so, dass es sein kann gefunden in PYTHONPATH. Ein Beispiel ist $AIRFLOW_HOME/config
Erstellen leerer Dateien mit dem Namen $AIRFLOW_HOME/config/log_config.py und
$AIRFLOW_HOME/config/__init__.py
Kopieren Sie den Inhalt des airflow/config_templates/airflow_local_settings.py in die log_config.py die Datei, die gerade erstellt wurde in dem oben genannten Schritt.
Anpassen der folgenden Teile von der Vorlage:
Stellen Sie sicher, dass eine s3-Verbindung Haken definiert wurde, in den Luftstrom, als pro die obige Antwort. Die Haken haben sollte lese-und Schreibzugriff auf den s3-bucket oben definiert sind, in S3_LOG_FOLDER.
Update $AIRFLOW_HOME/Luftstrom.cfg enthalten:
Starten Sie den Luftstrom webserver und der scheduler und einen trigger (oder warten) einen neuen task ausführen.
Stellen Sie sicher, dass die Protokolle zeigen, bis für die neu ausgeführten Aufgaben in die Eimer, die Sie definiert haben.
Stellen Sie sicher, dass die s3 storage viewer arbeitet in der Benutzeroberfläche. Ziehen Sie sich einen neu ausgeführt Aufgabe, und stellen Sie sicher, dass Sie etwas wie:
$AIRFLOW_HOME/config/__init__.py.
?s3TaskHandler
sollteS3TaskHandler
remote_log_conn_id = s3://$AWS_ACCESS_KEY:$AWS_SECRET_KEY@$REMOTE_BASE_LOG_FOLDER
- und set -remote_base_log_folder = "s3://$REMOTE_BASE_LOG_FOLDER"
In diesem Fall: REMOTE_BASE_LOG_FOLDER = top-level-bucket/Luftstrom/logsinitdb
aber bevor mein webserver/scheduler in das startup-script.(Aktualisiert, sobald der Luftstrom 1.10.2)
Hier ist eine Lösung, wenn man nicht mit der admin-UI.
Mein Luftstrom läuft nicht auf einem persistent server ... (Es wird neu gestartet, jeden Tag in einem Docker-container auf Heroku.) Ich weiß, ich bin nicht auf eine Menge toller features, aber in meinem minimal-setup, ich berühren Sie niemals die admin-Benutzeroberfläche oder die cfg-Datei. Stattdessen habe ich den Luftstrom-spezifische Umgebungsvariablen in bash-Skript, die überschreibt das .cfg-Datei.
apache-Volumenstrom[s3]
Erste von allen, müssen Sie die
s3
subpackage installiert haben, um schreiben Sie Ihre Luftstrom Protokolle zu S3. (boto3
funktioniert gut für die Python jobs in Ihrer DAGs, aber dieS3Hook
hängt von der s3 subpackage.)Eine weitere Seite Anmerkung: conda installieren nicht verarbeitet das noch, so habe ich zu tun
pip install apache-airflow[s3]
.Umgebungsvariablen
In ein bash-Skript, habe ich diese
core
Variablen. Ab diese Anweisungen aber mit der NamenskonventionAIRFLOW__{SECTION}__{KEY}
für Umwelt-Variablen, die ich tun:S3 Verbindungs-ID
Den
s3_uri
oben ist eine Verbindungs-ID, die ich mir ausgedacht habe. Im Luftstrom, es entspricht, eine weitere Umgebungsvariable,AIRFLOW_CONN_S3_URI
. Der Wert von ist, dass Ihre S3-Pfad, die in URI-form. Das istSpeichern aber Sie behandeln andere sensible Umgebungsvariablen.
Mit dieser Konfiguration Luftstrom wird in der Lage sein zu schreiben Sie Ihre Protokolle auf S3. Sie Folgen dem Pfad der
s3://bucket/key/dag/task_id/timestamp/1.log
.Anhang zum Upgrade von Luftstrom 1.8 Luftstrom 1.10
Habe ich vor kurzem aktualisiert meine Produktions-pipeline vom Luftstrom 1.8 1.9 dann 1.10. Die gute Nachricht ist, dass die änderungen sind ziemlich klein, der rest der Arbeit war, nur um herauszufinden, die Nuancen mit der package-Installationen (unabhängig von der ursprünglichen Frage zur S3-Protokolle).
(1) Zunächst einmal, ich brauchte ein upgrade auf Python 3.6 mit Luftstrom 1.9.
(2) Der name des Pakets geändert von
airflow
zuapache-airflow
mit 1.9. Sie auch vielleicht in diese in Ihrempip install
.(3) Das Paket
psutil
hat in einer bestimmten version Bereich für die Luftzirkulation. Sie kann auch diese, wenn Sie tunpip install apache-airflow
.(4) Python ist3-dev-Header benötigt werden, mit Luftstrom 1.9+.
(5) Hier sind die wesentlichen änderungen:
export AIRFLOW__CORE__REMOTE_LOGGING=True
ist nun erforderlich. Und(6) Die Protokolle haben einen etwas anderen Weg in der S3, die ich aktualisiert in der Antwort:
s3://bucket/key/dag/task_id/timestamp/1.log
.Aber das ist es! Die Protokolle funktionierte nicht in 1.9, also empfehle ich einfach geradeaus bis 1.10, jetzt, dass es verfügbar ist.
Abgeschlossen Arne die Antwort mit dem letzten Luftstrom updates, die Sie nicht benötigen, um
task_log_reader
auf einen anderen Wert als den Standardwert ein :task
Als wenn Sie Folgen Sie den Standard-logging-Vorlage airflow/config_templates/airflow_local_settings.py können Sie sehen, seit diesem commit (Hinweis des Hundeführers name geändert
's3': {'task'...
statts3.task
) das ist der Wert, auf den remote-Ordner(REMOTE_BASE_LOG_FOLDER
) ersetzen wird der handler mit der rechten:Mehr details auf, wie Sie sich zu/Lesen von S3 : https://github.com/apache/incubator-airflow/blob/master/docs/howto/write-logs.rst#writing-logs-to-amazon-s3
Nur eine Randnotiz jemand folgende sehr nützliche Anweisungen in die obige Antwort:
Wenn Sie stolpern auf dieses Problem: "ModuleNotFoundError: Kein Modul mit dem Namen
'Luftstrom.utils.log.logging_mixin.RedirectStdHandler'" wie hier referenziert (was passiert, wenn mittels Luftstrom 1.9), die Lösung ist einfach - verwenden, eher ist diese Basis-Vorlage: https://github.com/apache/incubator-airflow/blob/v1-9-stable/airflow/config_templates/airflow_local_settings.py (und befolgen Sie alle anderen Anweisungen in die obige Antwort)
Aktuellen Vorlage incubator-airflow/airflow/config_templates/airflow_local_settings.py präsentieren im master-branch enthält eine Referenz auf die Klasse "Luftstrom.utils.log.s3_task_handler.S3TaskHandler", die nicht in den apache-Luftstrom==1.9.0 python-Paket.
Hoffe, das hilft!
Habe es die Arbeit mit Luftstrom 10 in kube.
Ich habe Folgendes env var sets: