web-dev-qa-db-ja.com

Airflow SimpleHttpOperator GETリクエストからの応答にアクセスする方法

私はAirflowを学習していて、簡単な質問があります。以下はdog_retrieverと呼ばれる私のDAGです

import airflow
from airflow import DAG
from airflow.operators.http_operator import SimpleHttpOperator
from airflow.operators.sensors import HttpSensor
from datetime import datetime, timedelta
import json



default_args = {
    'owner': 'Loftium',
    'depends_on_past': False,
    'start_date': datetime(2017, 10, 9),
    'email': '[email protected]',
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 3,
    'retry_delay': timedelta(minutes=3),
}

dag = DAG('dog_retriever',
    schedule_interval='@once',
    default_args=default_args)

t1 = SimpleHttpOperator(
    task_id='get_labrador',
    method='GET',
    http_conn_id='http_default',
    endpoint='api/breed/labrador/images',
    headers={"Content-Type": "application/json"},
    dag=dag)

t2 = SimpleHttpOperator(
    task_id='get_breeds',
    method='GET',
    http_conn_id='http_default',
    endpoint='api/breeds/list',
    headers={"Content-Type": "application/json"},
    dag=dag)

t2.set_upstream(t1)

Airflowをテストする手段として、この非常にシンプルな http://dog.ceo APIで、いくつかのエンドポイントに対して2つのGETリクエストを作成しています。目標は、Airflowを介して取得した一部のデータを操作する方法を学ぶことです

実行は機能しています。コードはタスクt1とt2のenpointを正常に呼び出します。私が記述したset_upstreamルールに基づく正しい順序で、それらがAirflow UIに記録されていることがわかります。

私が理解できないのは、これらの2つのタスクのjson応答にアクセスする方法です。とてもシンプルに見えますが、わかりません。 SimpleHtttpOperatorには、response_checkのパラメーターがありますが、json応答を単に印刷、保存、または表示するものはありません。

ありがとう。

8
Rachel Lanman

これはSimpleHttpOperatorであり、実際のjsonはXCOMにプッシュされ、そこから取得できます。そのアクションのコード行は次のとおりです。 https://github.com/Apache/incubator-airflow/blob/master/airflow/operators/http_operator.py#L87

xcom_Push=Trueを設定する必要があるため、最初のt1は次のようになります。

t1 = SimpleHttpOperator(
    task_id='get_labrador',
    method='GET',
    http_conn_id='http_default',
    endpoint='api/breed/labrador/images',
    headers={"Content-Type": "application/json"},
    xcom_Push=True,
    dag=dag)

XCOMでreturn valueを含むすべてのJSONを見つけることができるはずです。XCOMの詳細は次の場所にあります https://airflow.incubator.Apache.org/concepts.html#xcoms

13
Chengzhi

この回答は主に、しようとする(またはしたい)callプロセスからのAirflowワークフローDAGおよびreceive任意のdataに追加します。 DAGのアクティビティの結果です。

重要 DAGを実行するにはHTTP POSTが必要であり、これに対する応答であることを理解するPOSTはhardcoded Airflowで、つまりAirflowコード自体に変更を加えない場合、Airflowはステータスコードとメッセージ以外のものを返すことはありません要求元のプロセスに。

Airflowは、主にETL(抽出、変換、読み込み)ワークフローのデータパイプラインを作成するために使用されているようです。既存のAirflow Operatorsです。 SimpleHttpOperator、RESTful Webサービスからデータを取得できます、それを処理し、他の演算子を使用してデータベースに書き込みますただし、HTTP POSTへの応答でデータを返しません実行ワークフローDAG。

オペレーターが応答でこのデータを返したとしても、Airflowソースコードを調べると、trigger_dag()メソッドがそれをチェックまたは返さないことが確認されます。

Apache_airflow_airflow_www_api_experimental_endpoints.py

Apache_airflow_airflow_api_client_json_client.py

それが返すすべてはこの確認メッセージです:

オーケストレーションサービスで受信したAirflow DagRunメッセージ

Airflowはオープンソースなので、trigger_dag()メソッドを変更してデータを返すことができると思いますが、フォークされたコードベースを維持できず、クラウドホスティングされたAirflowベースのサービスを使用できなくなります。 Cloud Composer Google Cloud Platformでは、変更が含まれていないためです。

さらに悪いことに、Apache Airflowはハードコードされたステータスメッセージを正しく返すことすらできません。

[〜#〜] post [〜#〜]がAirflowに正常に送信された場合/dags/{DAG-ID}/dag_runsエンドポイント、「200 OK」応答を受け取りますnot必要に応じて「201 Created」応答。また、Airflowは、応答のコンテンツ本文を「Created…」ステータスメッセージで「ハードコード」します。 標準ただし、は、新しく作成されたリソースのURIをレスポンスヘッダーで返す、ボディではありません…これにより、ボディは自由に生成されたデータを返すことができます/この作成中に(またはその結果として)集計されます。

私はこの欠陥を「ブラインド」(または私が「ナイーブ」と呼んでいるもの)のアジャイル/ MVP駆動のアプローチに起因すると考えています。 Airflowはデータパイプラインの作成に圧倒的に使用されます(およびソフトウェアエンジニアではなく)データサイエンティストのため、-Airflowオペレーターは相互にデータを共有できます独自の内部を使用して@Chengzhiの役立つ回答が示すXCom機能(ありがとうございます!)ただし、どのような状況でもリクエスタにデータを返すことはできません DAGを開始しました。つまり、SimpleHttpOperatorがサードパーティからデータを取得できますRESTfulサービスであり、そのデータを強化、集約、変換するPythonOperator(XCom経由)とそのデータを共有できます。 PythonOperatorは、その結果をデータベースに結果を直接格納するPostgresOperatorと共有できます。しかし結果は、作業の実行を要求したプロセスに返すことはできません、つまりオーケストレーションサービスであり、現在のユーザーによって駆動されているエアフロー以外のユースケースにはAirflowは役に立たなくなります。

ここでのポイント(少なくとも私にとっては)は、1)あまりにも多くの専門知識を誰にも、またはどの組織にも帰することは決してありません。 Apacheはソフトウェア開発に深く重要なルーツを持つ重要な組織です…しかし、それらは完璧ではありません。また、2)常に社内の独自ソリューションに注意してください。オープンな標準ベースのソリューションは、1つだけでなく、さまざまな視点から検討されてきました。

非常にシンプルで合理的なことのように思われることを実行するために、さまざまな方法を追跡して1週間近くも時間を費やしました。この答えが誰か他の人の時間を節約することを願っています。

3
Doug Wilson