使用xcom pull检索从其他dag推送的变量

时间:2019-11-04 09:51:45

标签: python airflow apache-airflow-xcom

我对气流非常陌生,并使用“ xcom_push”和“ xcom_pull”功能。

我有两个任务d1和任务t2,第二个d2和任务t2。

现在我使用以下命令从dag d1推送值:

kwargs['ti'].xcom_push(key='start_date',value=start_date)
kwargs['ti'].xcom_push(key='end_date',value=end_date)

并使用以下命令在dag d2中提取相同的开始日期和结束日期:

start_date = kwargs['ti'].xcom_pull(dag_id = 'd1', task_ids='t1',key="start_date")
end_date = kwargs['ti'].xcom_pull(dag_id = 'd1', task_ids='t2' , key="end_Date")

但是在xcom_pull期间出现“ NONETYPE”错误。有人可以帮助我如何将值从dag d1拖入dag d2

3 个答案:

答案 0 :(得分:0)

您实际上设置了xcom变量吗?

请尝试以下问题:

d1

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.models import Variable
from datetime import datetime, timedelta

args = {
    'owner': 'znovak',
    'email': ['me@me.com'],
    'depends_on_past': False,
    'email_on_retry': False,
    'start_date': datetime(2019, 11, 4)
}

dag = DAG(
    dag_id='d1',
    default_args=args,
    catchup=False,
    schedule_interval=None
    )

###############################
##### Create DAG Parameters ###
###############################
def set_xcom_params(**kwargs):
    kwargs['ti'].xcom_push(key='start_date',value=start_date)
    kwargs['ti'].xcom_push(key='end_date',value=end_date)

t1 = PythonOperator(
    task_id='t1',
    python_callable=set_xcom_params,
    dag=dag,
    provide_context=True
    )

d2

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.models import Variable
from datetime import datetime, timedelta

args = {
    'owner': 'znovak',
    'email': ['me@me.com'],
    'depends_on_past': False,
    'email_on_retry': False,
    'start_date': datetime(2019, 11, 4)
}

dag = DAG(
    dag_id='d2',
    default_args=args,
    catchup=False,
    schedule_interval=None
    )

def pull_xcom_params(**kwargs):
    start_date = kwargs['ti'].xcom_pull(dag_id='d1',task_ids='t1',key="start_date")
    end_date = kwargs['ti'].xcom_pull(dag_id='d1',task_ids='t1',key="end_date")
    print(start_date)
    print(end_date)

t2 = PythonOperator(
    task_id='t2',
    python_callable=pull_xcom_params,
    dag=dag,
    provide_context=True
    )

答案 1 :(得分:0)

XCOM用于在单个Dag的任务之间交换信息。 您希望为另一个Dag检索Dag的输出的用例可以通过将结果存储在文件/数据库中并进行相应处理来完成。

答案 2 :(得分:0)

您需要额外传递参数 include_prior_dates=True,以便它检查以前日期的 XCom。

<块引用>

:param include_prior_dates:如果为 False,则只有来自当前的 XCom execution_date 被返回。如果为真,XCom 来自以前的日期 也被退回。

在你的情况下看起来像这样:

start_date = kwargs['ti'].xcom_pull(dag_id = 'd1', task_ids='t1',key="start_date", include_prior_dates=True)
end_date = kwargs['ti'].xcom_pull(dag_id = 'd1', task_ids='t2' , key="end_Date", include_prior_dates=True)