我对气流非常陌生,并使用“ 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
答案 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)