Airflow 如何访问来自SimpleHttpOperator GET请求的响应

Airflow 如何访问来自SimpleHttpOperator GET请求的响应,airflow,data-pipeline,Airflow,Data Pipeline,我正在学习气流,有一个简单的问题。下面是我的DAG,名为dog\u retriever: 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

我正在学习气流,有一个简单的问题。下面是我的DAG,名为
dog\u retriever

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': 'rachel@loftium.com',
    '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)
作为测试气流的一种方法,我只需在这个非常简单的API中向某些端点发出两个GET请求。目标是学习如何处理通过气流检索的一些数据

执行正常-我的代码成功地调用了任务t1和t2中的端点,我可以看到它们以基于我编写的
set\u上游
规则的正确顺序记录在Airflow UI中

我不知道如何访问这两个任务的JSON响应。看起来很简单,但我想不出来。在SimpleHtttpOperator中,我看到了一个用于响应检查的参数,但没有简单打印、存储或查看JSON响应的参数


谢谢。

因为这是SimpleHttpOperator,实际的json被推送到XCOM,您可以从那里得到它。以下是该操作的代码行:

您需要做的是设置
xcom\u 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中找到所有返回值为
的JSON,有关XCOM的更多详细信息,请访问:

我主要为尝试(或想要)的任何人添加此答案从流程调用工作流DAG,并接收来自DAG活动的任何数据

重要的是要了解运行DAG需要HTTP POST,并且对该POST的响应在Airflow中是硬编码的,即如果不对Airflow代码本身进行更改,Airflow将只向请求进程返回状态代码和消息

气流似乎主要用于为ETL(提取、转换、加载)工作流创建数据管道,现有的气流操作符,例如SimpleHttpOperator,可以从RESTful web服务获取数据,处理数据,并使用其他操作符将数据写入数据库,但不要在对运行工作流DAG的HTTP POST的响应中返回它

即使操作员确实在响应中返回了此数据,查看气流源代码也会确认trigger_dag()方法不会检查或返回该数据:

它只返回此确认消息:

由于Airflow是开源的,我想我们可以修改trigger_dag()方法来返回数据,但这样我们就无法维护分叉的代码库,我们就无法在Google cloud平台上使用云托管的、基于Airflow的服务,比如cloud Composer,因为它不包括我们的修改

更糟糕的是,Apache Airflow甚至没有正确返回其硬编码状态消息

当我们成功发布到气流
/dags/{DAG-ID}/DAG_运行的
端点时,我们收到一个“200 OK”响应,一个我们应该收到的“201 Created”响应。和“硬编码”响应的内容体及其“已创建…”状态消息但是,标准是在响应头中返回新创建的资源的Uri,而不是在正文中…这将使正文可以自由返回在此创建过程中生成/聚合(或由此产生)的任何数据

我将此缺陷归因于“盲目”(或我称之为“幼稚”)的敏捷/MVP驱动方法,该方法只添加所需的功能,而不是保持意识,并为更通用的实用程序留出空间。由于气流绝大多数用于为数据科学家(而非软件工程师)创建数据管道,因此气流操作员可以使用其专有的内部XCom功能彼此共享数据,正如@Chengzhi的有益回答所指出的(谢谢!)但在任何情况下都不能将数据返回给启动DAG的请求者,即SimpleHttpOperator可以从第三方RESTful服务检索数据,并可以与PythonOperator(通过XCom)共享该数据,PythonOperator可以丰富、聚合和/或转换数据。PythonOperator可以与PostgresOperator共享数据,PostgresOperator将结果直接存储在数据库中。但是,结果永远无法返回到请求完成工作的流程,即我们的编排服务,这使得气流对于任何用例都是无用的,除了当前用户驱动的用例

这里的收获(至少对我来说)是:永远不要把太多的专业知识归功于任何人或任何组织。Apache是一个重要的组织,在软件开发方面有着深厚而重要的根基……但它们并不完美。2)始终注意内部专有解决方案。开放的、基于标准的解决方案已经从许多不同的角度进行了检查和审查,而不仅仅是一个角度


我花了将近一周的时间去寻找不同的方法来做一件看似简单而合理的事情。我希望这个答案能为其他人节省一些时间。

谢谢@Chengzhi,这很有效。“不过我想从现在起我会简单地使用蟒蛇机。”成智。你好您能否分享第二个SimpleHttpOperator任务
t2
的外观,该任务可能使用第一个任务中的数据。问题是,我看到无数的例子,它们说-只使用xcom和push数据,但它们没有显示Receiver部分,或者其他任务,它们可能使用前一个任务推送的数据。嗨,这里!您是否知道如何从task
t1
的响应中访问task
t2
中的数据?如果你能分享这些信息,那就太好了。成智的回答解释了如何推送和获取,但在任务
t2
中如何拉送?