如何将值从Xcom传递给另一个运算符?

时间:2019-11-20 02:30:07

标签: apache-airflow-xcom

Input具有参数DockerOperator,该参数设置后会将Docker容器的输出推送到Xcom:

xcom_push

在Xcom的管理界面中,我可以通过键t1 = DockerOperator(task_id='run-hello-world-container', image='hello-world', xcom_push=True, xcom_all=True, dag=dag) 看到这些值。但是,如何在DAG中访问它们?

如果我尝试:

return_value

我得到t1_email_output = EmailOperator(task_id='t1_email_output', to='user@example.com', subject='Airflow sent you an email!', html_content={{ ti.xcom_pull(task_ids='return_value') }}, dag=dag)

如果我尝试:

Broken DAG: [PATH] name 'ti' is not defined

我得到t1_email_output = EmailOperator(task_id='t1_email_output', to='user@example.com', subject='Airflow sent you an email!', html_content=t1.xcom_pull(task_ids='return_value'), dag=dag)

2 个答案:

答案 0 :(得分:0)

您需要传递要从中提取xcom的任务ID,而不是变量名 在您的示例中,将是

{{ ti.xcom_pull('run-hello-world-container') }}

在第二个代码段中也应为“ ti” ,而不是“ t1”

html_content=ti.xcom_pull('run-hello-world-container'),

答案 1 :(得分:0)

我发现了问题-原来我缺少引号,而且我的参数也有误:

t1_email_output = EmailOperator(task_id='t1_email_output',
                                to='user@example.com',
                                subject='Airflow sent you an email!',
                                html_content="{{ ti.xcom_pull(key='return_value') }}",
                                dag=dag)

发送一封包含Docker容器输出的电子邮件,就像我期望的那样。

我认为正在发生的事情是,在运行DAG时,Airflow将{{ }}语法作为Jinja模板进行处理,但在加载时却没有。因此,如果我不加引号,则Airflow在尝试检测和加载DAG时会得到Python异常,因为模板尚未呈现。但是,如果添加引号,则模板化表达式将被视为字符串,并在由Airflow加载时被Python解释器忽略。但是,当EmailOperator在DAG运行期间实际上被触发时,该模板将呈现为对相关数据的实际引用。