it-swarm.com.de

s3 für Protokolle im Luftstrom einrichten

Ich verwende Docker-Compose, um einen skalierbaren Luftstromcluster einzurichten. Ich habe meinen Ansatz aus dieser Docker-Datei abgeleitet https://hub.docker.com/r/puckel/docker-airflow/

Mein Problem ist, die Protokolle so einzurichten, dass sie von s3 schreiben/lesen können. Wenn ein Tag abgeschlossen ist, erhalte 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

Ich habe einen neuen Abschnitt in der airflow.cfg-Datei so eingerichtet

[MyS3Conn]
aws_access_key_id = xxxxxxx
aws_secret_access_key = xxxxxxx
aws_default_region = xxxxxxx

Und dann den s3-Pfad im Abschnitt Remote-Protokolle in airflow.cfg angegeben

remote_base_log_folder = s3://buckets/xxxx/airflow/logs
remote_log_conn_id = MyS3Conn

Habe ich das richtig eingerichtet und es liegt ein Fehler vor? Gibt es hier ein Erfolgsrezept, das ich vermisse?

- Aktualisieren

Ich habe versucht, in URI- und JSON-Formate zu exportieren, und beides schien nicht zu funktionieren. Ich habe dann die Dateien aws_access_key_id und aws_secret_access_key exportiert und dann hat airflow angefangen, sie aufzuheben. Jetzt bekomme ich seinen Fehler in den Arbeiterprotokollen 

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

- Aktualisieren

Ich habe auch diesen Link gefunden https://www.mail-archive.com/[email protected]/msg00462.html

Ich habe dann einen meiner Worker-Computer (getrennt vom Webserver und Scheduler) in ein Shell-Laufwerk gepackt und dieses Bit in Python ausgeführt

import airflow
s3 = airflow.hooks.S3Hook('s3_conn')
s3.load_string('test', airflow.conf.get('core', 'remote_base_log_folder'))

Ich erhalte diesen Fehler.

boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

Ich habe versucht, verschiedene Arten von AIRFLOW_CONN_-Umgebungen zu exportieren, wie im Verbindungsabschnitt https://airflow.incubator.Apache.org/concepts.html und in anderen Antworten auf diese Frage erläutert.

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>"}

Ich habe auch AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY ohne Erfolg exportiert.

Diese Anmeldeinformationen werden in einer Datenbank gespeichert. Wenn ich sie in der Benutzeroberfläche hinzufüge, sollten sie von den Arbeitern abgeholt werden, sie können jedoch aus irgendeinem Grund keine Protokolle schreiben/lesen.

28
JackStat

Sie müssen die S3-Verbindung über die Airflow-Benutzeroberfläche einrichten. Dazu müssen Sie auf der Airflow-Benutzeroberfläche auf die Registerkarte Admin -> Connections gehen und eine neue Zeile für Ihre S3-Verbindung erstellen.

Eine Beispielkonfiguration wäre:

Conn Id: my_conn_S3

Verbindungstyp: S3

Extra: {"aws_access_key_id": "your_aws_key_id", "aws_secret_access_key": "your_aws_secret_key"}

14
Him

UPDATE Airflow 1.10 erleichtert die Protokollierung sehr viel

Richten Sie für die S3-Protokollierung den Verbindungshaken wie folgt ein: die obige Antwort

und fügen Sie dann einfach Folgendes zu airflow.cfg hinzu

    [core]
    # Airflow can store logs remotely in AWS S3. Users must supply a remote
    # location URL (starting with either 's3://...') and an Airflow connection
    # id that provides access to the storage location.
    remote_base_log_folder = s3://my-bucket/path/to/logs
    remote_log_conn_id = MyS3Conn
    # Use server-side encryption for logs stored in S3
    encrypt_s3_logs = False

Für die gcs-Protokollierung

  1. Installieren Sie zuerst das Paket gcp_api wie folgt: pip install Apache-airflow [gcp_api].

  2. Richten Sie den Verbindungshaken gemäß obige Antwort ein

  3. Fügen Sie airflow.cfg Folgendes hinzu

    [core]
    # Airflow can store logs remotely in AWS S3. Users must supply a remote
    # location URL (starting with either 's3://...') and an Airflow connection
    # id that provides access to the storage location.
    remote_logging = True
    remote_base_log_folder = gs://my-bucket/path/to/logs
    remote_log_conn_id = MyGCSConn
    

HINWEIS: Ab Airflow 1.9 wurde die Remote-Protokollierung erheblich geändert . Wenn Sie 1.9 verwenden, lesen Sie weiter.

Referenz hier

Vollständige Anweisungen:

  1. Erstellen Sie ein Verzeichnis zum Speichern von Konfigurationen und platzieren Sie dieses, damit es in PYTHONPATH gefunden werden kann. Ein Beispiel ist $ AIRFLOW_HOME/config

  2. Erstellen Sie leere Dateien mit den Namen $ AIRFLOW_HOME/config/log_config.py und $ AIRFLOW_HOME/config/__ init__.py

  3. Kopieren Sie den Inhalt von airflow/config_templates/airflow_local_settings.py in die Datei log_config.py, die gerade im obigen Schritt erstellt wurde.

  4. Passen Sie die folgenden Teile der Vorlage an:

    #Add this variable to the top of the file. Note the trailing slash.
    S3_LOG_FOLDER = 's3://<bucket where logs should be persisted>/'
    
    Rename DEFAULT_LOGGING_CONFIG to LOGGING CONFIG
    LOGGING_CONFIG = ...
    
    Add a S3TaskHandler to the 'handlers' block of the LOGGING_CONFIG variable
    's3.task': {
        'class': 'airflow.utils.log.s3_task_handler.S3TaskHandler',
        'formatter': 'airflow.task',
        'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
        's3_log_folder': S3_LOG_FOLDER,
        'filename_template': FILENAME_TEMPLATE,
    },
    
     Update the airflow.task and airflow.task_runner blocks to be 's3.task' instead >of 'file.task'.
    'loggers': {
        'airflow.task': {
            'handlers': ['s3.task'],
            ...
        },
        'airflow.task_runner': {
            'handlers': ['s3.task'],
            ...
        },
        'airflow': {
            'handlers': ['console'],
            ...
        },
    }
    
  5. Stellen Sie sicher, dass in Airflow ein S3-Verbindungshaken definiert wurde, wie in obige Antwort . Der Hook sollte Lese- und Schreibzugriff auf den oben in S3_LOG_FOLDER definierten S3-Bucket haben.

  6. Aktualisieren Sie $ AIRFLOW_HOME/airflow.cfg, um Folgendes zu enthalten:

    task_log_reader = s3.task
    logging_config_class = log_config.LOGGING_CONFIG
    remote_log_conn_id = <name of the s3 platform hook>
    
  7. Starten Sie den Airflow-Webserver und den Scheduler neu und lösen Sie eine neue Taskausführung aus (oder warten Sie darauf).

  8. Stellen Sie sicher, dass Protokolle für neu ausgeführte Aufgaben in dem von Ihnen definierten Bereich angezeigt werden.

  9. Stellen Sie sicher, dass der S3 Storage Viewer in der Benutzeroberfläche funktioniert. Rufen Sie eine neu ausgeführte Aufgabe auf und vergewissern Sie sich, dass Sie Folgendes sehen:

    *** Reading remote log from gs://<bucket where logs should be persisted>/example_bash_operator/run_this_last/2017-10-03T00:00:00/16.log.
    [2017-10-03 21:57:50,056] {cli.py:377} INFO - Running on Host chrisr-00532
    [2017-10-03 21:57:50,093] {base_task_runner.py:115} INFO - Running: ['bash', '-c', u'airflow run example_bash_operator run_this_last 2017-10-03T00:00:00 --job_id 47 --raw -sd DAGS_FOLDER/example_dags/example_bash_operator.py']
    [2017-10-03 21:57:51,264] {base_task_runner.py:98} INFO - Subtask: [2017-10-03 21:57:51,263] {__init__.py:45} INFO - Using executor SequentialExecutor
    [2017-10-03 21:57:51,306] {base_task_runner.py:98} INFO - Subtask: [2017-10-03 21:57:51,306] {models.py:186} INFO - Filling up the DagBag from /airflow/dags/example_dags/example_bash_operator.py
    
32
Arne Huang

(Aktualisiert ab Airflow 1.10.2)

Hier ist eine Lösung, wenn Sie verwenden Sie nicht die Admin-Benutzeroberfläche.

Mein Airflow läuft nicht auf einem beständigen Server ... (Er wird jeden Tag in einem Docker-Container auf Heroku von Neuem gestartet.) Ich weiß, dass mir viele großartige Funktionen fehlen, aber in meinem Minimalformat) Setup, ich berühre niemals die Admin-Benutzeroberfläche oder die cfg-Datei. Stattdessen muss ich Airflow-spezifische Umgebungsvariablen in einem Bash-Skript festlegen, das die .cfg-Datei überschreibt.

Apache-Luftstrom [s3]

Zunächst benötigen Sie das s3-Unterpaket, um Ihre Airflow-Protokolle in S3 zu schreiben. (boto3 funktioniert gut für die Python-Jobs in Ihren DAGs, aber S3Hook hängt vom s3-Unterpaket ab.)

Noch eine Randbemerkung: conda install kann damit noch nicht umgehen , also muss ich pip install Apache-airflow[s3] tun.

Umgebungsvariablen

In einem Bash-Skript setze ich diese core-Variablen. Ausgehend von diesen Anweisungen aber unter Verwendung der Namenskonvention AIRFLOW__{SECTION}__{KEY} für Umgebungsvariablen, mache ich:

export AIRFLOW__CORE__REMOTE_LOGGING=True
export AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://bucket/key
export AIRFLOW__CORE__REMOTE_LOG_CONN_ID=s3_uri
export AIRFLOW__CORE__ENCRYPT_S3_LOGS=False

S3-Verbindungs-ID

Der s3_uri ist eine Verbindungs-ID, die ich erstellt habe. In Airflow entspricht es einer anderen Umgebungsvariablen, AIRFLOW_CONN_S3_URI. Der Wert davon ist Ihr S3-Pfad, der in URI-Form sein muss. Das ist

s3://access_key:[email protected]/key

Speichern Sie dies, jedoch behandeln Sie andere vertrauliche Umgebungsvariablen.

Mit dieser Konfiguration kann Airflow Ihre Protokolle in S3 schreiben. Sie folgen dem Pfad von s3://bucket/key/dag/task_id/timestamp/1.log.


Anhang zum Upgrade von Airflow 1.8 auf Airflow 1.10

Ich habe kürzlich meine Produktionspipeline von Airflow 1.8 auf 1.9 und dann auf 1.10 aufgerüstet. Eine gute Nachricht ist, dass die Änderungen ziemlich klein sind. Der Rest der Arbeit bestand nur darin, Nuancen bei den Paketinstallationen herauszufinden (unabhängig von der ursprünglichen Frage zu S3-Protokollen).

(1) Zunächst musste ich mit Airflow 1.9 auf Python 3.6 aktualisieren.

(2) Der Paketname wurde mit 1.9 von airflow in Apache-airflow geändert. Sie könnten auch auf this in Ihrem pip install stoßen.

(3) Das Paket psutil muss in einem bestimmten Versionsbereich für Airflow liegen. Sie können dies feststellen, wenn Sie pip install Apache-airflow ausführen.

(4) Mit Airflow 1.9+ werden python3-dev-Header benötigt.

(5) Hier sind die wesentlichen Änderungen: export AIRFLOW__CORE__REMOTE_LOGGING=True ist jetzt erforderlich. Und

(6) Die Protokolle haben in S3 einen etwas anderen Pfad, den ich in der Antwort aktualisiert habe: s3://bucket/key/dag/task_id/timestamp/1.log.

Aber das ist es! Die Protokolle funktionierten in 1.9 nicht, daher empfehle ich, direkt zu 1.10 zu gehen, da es jetzt verfügbar ist.

7
Niels Joaquin

Um die Antwort von Arne mit den letzten Airflow-Aktualisierungen abzuschließen, müssen Sie task_log_reader nicht auf einen anderen Wert als den Standardwert setzen: task

Wenn Sie der Standardprotokollierungsvorlage airflow/config_templates/airflow_local_settings.py folgen, können Sie sehen, da dieses Commit (beachten Sie, dass der Name des Handlers in 's3': {'task'... statt s3.task geändert wurde). Dies ist der Wert im entfernten Ordner (REMOTE_BASE_LOG_FOLDER). ersetzt den Handler durch den richtigen:

REMOTE_LOGGING = conf.get('core', 'remote_logging')

if REMOTE_LOGGING and REMOTE_BASE_LOG_FOLDER.startswith('s3://'):
        DEFAULT_LOGGING_CONFIG['handlers'].update(REMOTE_HANDLERS['s3'])
Elif REMOTE_LOGGING and REMOTE_BASE_LOG_FOLDER.startswith('gs://'):
        DEFAULT_LOGGING_CONFIG['handlers'].update(REMOTE_HANDLERS['gcs'])
Elif REMOTE_LOGGING and REMOTE_BASE_LOG_FOLDER.startswith('wasb'):
        DEFAULT_LOGGING_CONFIG['handlers'].update(REMOTE_HANDLERS['wasb'])
Elif REMOTE_LOGGING and ELASTICSEARCH_Host:
        DEFAULT_LOGGING_CONFIG['handlers'].update(REMOTE_HANDLERS['elasticsearch'])

Weitere Informationen zum Anmelden bei/Lesen von S3: https://github.com/Apache/incubator-airflow/blob/master/docs/howto/write-logs.rst#writing-logs-to-Amazon- s3

2
Paul Leclercq

Nur eine Randnotiz für alle, die den sehr nützlichen Anweisungen in der obigen Antwort : .__ folgen. Wenn Sie über dieses Problem stolpern: "ModuleNotFoundError: Kein Modul mit dem Namen ' " wie hier verwiesen (was bei der Verwendung von Airflow 1.9 der Fall ist), das Update ist einfach - verwenden Sie eher diese Basisvorlage: https://github.com/Apache/incubator-airflow/blob/v1-9- stable/airflow/config_templates/airflow_local_settings.py (und folgen Sie allen anderen Anweisungen in der obigen Antwort )

Die aktuelle Vorlage inkubator-airflow/airflow/config_templates/airflow_local_settings.py enthält einen Verweis auf die Klasse "airflow.utils.log.s3_task_handler.S3TaskHandler", die in Apache-airflow == nicht vorhanden ist 1.9.0 Python-Paket. Hoffe das hilft!

1
diogoa

Habe es mit Airflow 10 in kube . Ich habe die folgenden env var-Sets:

AIRFLOW_CONN_LOGS_S3=s3://id:[email protected]
AIRFLOW__CORE__REMOTE_LOGGING=True
AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://xxxx/logs
AIRFLOW__CORE__REMOTE_LOG_CONN_ID=logs_s3
0
Bertrand Paquet