气流-自定义操作员进入xcom的价值途径

时间:2018-08-24 07:45:06

标签: airflow

自最近6个月以来,我一直在使用Airlfow。我非常高兴在Airflow中定义工作流程。 在以下情况下,我无法获得xcom值(以黄色突出显示)。

请在下面的示例代码中找到代码:

工作流程

def push_function(**context):
context['ti'].xcom_push(key='reportid', value='xyz')

dummy_operator = DummyOperator(
task_id='Start',
dag=main_dag
)

push_function_task = PythonOperator(
    task_id='push_function',
    provide_context=True,
    python_callable=push_function,
    op_kwargs={},
    dag=main_dag)


push_function_task .set_upstream(dummy_operator)

custom_task = CustomOperator(
        dag=main_dag,
        task_id='import_data',
        provide_context=True,
        url="http://www.google.com/{}".format("{{task_instance.xcom_pull(task_ids='push_function')}}")

     )

custom_task .set_upstream(push_function_task)

注释: 1. CustomOperator是我自己的操作员,负责下载给定URL的数据

请帮助我。

谢谢, 萨曼斯

1 个答案:

答案 0 :(得分:5)

我相信您在推拉XCom时按键不匹配。每个XCom值都与DAG ID,任务ID和密钥相关联。如果您用report_id键推动,那么也需要拉动它。

请注意,如果未将密钥指定为xcom_pull(),则它将使用默认值return_value。这是因为如果任务返回结果,则Airflow会在return_value键下自动将其推送到XCom。

这为您提供了两个解决问题的方法:

1)继续按report_id键,并确保也从中拉出

def push_function(**context):
    context['ti'].xcom_push(key='reportid', value='xyz')

...

custom_task = CustomOperator(
    ...
    url="http://www.google.com/{}".format("{{ task_instance.xcom_pull(task_ids='push_function', key='reportid') }}")
)

2)让push_function()返回要推送到XCom的值,然后从默认密钥中提取。

def push_function(**context):
    return 'xyz'

...

custom_task = CustomOperator(
    ...
    url="http://www.google.com/{}".format("{{ task_instance.xcom_pull(task_ids='push_function') }}")
)