it-swarm.com.de

Ausführen eines Jobs bei Airflow basierend auf Webrequest

Ich wollte wissen, ob Airflow-Tasks ausgeführt werden können, wenn eine Anfrage über HTTP abgerufen wird. Ich habe kein Interesse an der Planung von Airflow. Ich möchte es nur als Ersatz für Sellerie verwenden.

Eine Beispieloperation wäre also so etwas.

  1. Der Benutzer übermittelt ein Formular, in dem er einen Bericht anfordert.
  2. Das Backend empfängt die Anfrage und sendet dem Benutzer eine Benachrichtigung, dass die Anfrage empfangen wurde.
  3. Das Backend plant dann einen Job mit Airflow für die sofortige Ausführung.
  4. Airflow führt dann eine Reihe von Aufgaben aus, die einer DAG zugeordnet sind. Ziehen Sie zum Beispiel Daten zuerst von redshift, holen Sie Daten aus MySQL, führen Sie einige Operationen an den beiden Ergebnissätzen durch, kombinieren Sie sie und laden Sie die Ergebnisse zu Amazon S3 hoch, senden Sie eine E-Mail.

Von allem, was ich online lese, können Sie Airflow-Jobs ausführen, indem Sie airflow ... in der Befehlszeile ausführen. Ich habe mich gefragt, ob es eine Python-API gibt, die dasselbe ausführen kann.

Vielen Dank.

11

Das Airflow REST API Plugin würde Ihnen hier helfen. Nachdem Sie die Anweisungen zur Installation des Plugins befolgt haben, müssen Sie lediglich die folgende URL anklicken: http://{Host}:{PORT}/admin/rest_api/api/v1.0/trigger_dag?dag_id={dag_id}&run_id={run_id}&conf={url_encoded_json_parameters}. Ersetzen Sie dag_id durch die ID Ihres Dags, lassen Sie run_id weg oder geben Sie eine eindeutige ID ein, und übergeben Sie einen mit URL (mit alle Parameter, die Sie im ausgelösten Tag benötigen). 

Hier ein Beispiel für eine JavaScript-Funktion, die jQuery zum Aufrufen der Airflow-API verwendet: 

function triggerDag(dagId, dagParameters){
    var urlEncodedParameters = encodeURIComponent(dagParameters);
    var dagRunUrl = "http://airflow:8080/admin/rest_api/api/v1.0/trigger_dag?dag_id="+dagId+"&conf="+urlEncodedParameters;
    $.ajax({
        url: dagRunUrl,
        dataType: "json",
        success: function(msg) {
            console.log('Successfully started the dag');
        },
        error: function(e){
           console.log('Failed to start the dag');
        }
    });
}
13
Jeremy Farrell

Eine neue Option für den Luftstrom ist der experimental, aber integrierte API-Endpunkt in den neueren Builds von 1.7 und 1.8. Auf diese Weise können Sie einen REST - Dienst auf Ihrem Airflow-Server ausführen, um einen Port zu überwachen und CLI-Jobs anzunehmen.

Ich habe selbst nur begrenzte Erfahrung, aber ich habe erfolgreich Test-Dags absolviert. In den Unterlagen:

/api/experimental/dags/<DAG_ID>/dag_runs erstellt einen dag_run für eine gegebene dag-ID (POST).

Dadurch wird eine sofortige Ausführung des Dag geplant, den Sie ausführen möchten. Es verwendet jedoch immer noch den Scheduler, wartet auf einen Heartbeat, um zu sehen, dass dag ausgeführt wird, und übergibt Aufgaben an den Worker. Dies ist jedoch genau das gleiche Verhalten wie bei der CLI, daher glaube ich immer noch, dass es zu Ihrem Anwendungsfall passt.

Eine Dokumentation zur Konfiguration finden Sie hier: https://airflow.Apache.org/api.html

Es gibt auch einige einfache Beispiel-Clients im github unter airflow/api/clients

8
apathyman

Sie sollten unter Airflow HTTP Sensor nach Ihren Bedürfnissen suchen. Sie können dies verwenden, um einen Tag auszulösen.

5
nehiljain

Zu diesem Zweck kann die experimentelle REST - API von Airflow verwendet werden. 

Die folgende Anforderung löst eine DAG aus:

curl -X POST \
    http://<Host>:8080/api/experimental/dags/process_data/dag_runs \
    -H 'Cache-Control: no-cache' \
    -H 'Content-Type: application/json' \
    -d '{"conf":"{\"START_DATE\":\"2018-06-01 03:00:00\", \"STOP_DATE\":\"2018-06-01 23:00:00\"}'

Die folgende Anforderung ruft eine Liste von Dag-Läufen für eine bestimmte DAG-ID ab:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://<Host>:8080/api/experimental/dags/process_data/dag_runs

Damit die GET-API funktioniert, setzen Sie das Flag rbac auf True um airflow.cfg.

Im Folgenden finden Sie eine Liste der verfügbaren APIs: hier & dort .

0
Arnab Biswas