Apache Airflow如何将xcom_pull()值转换为DAG?

时间:2017-07-20 15:05:52

标签: python apache directed-acyclic-graphs airflow

我有一个自定义运算符,它按下面的方式推送XCOM值:

...
task_instance = context['task_instance']
task_instance.xcom_push("list_of_files",file_list)
...

工作正常。我有一个dag定义文件(my_dag.py),我使用自己的运算符创建一个任务,它推动XCOM值然后我想通过使用此xcom值进行循环。怎么拉?

2 个答案:

答案 0 :(得分:1)

您无法访问dag中的XCOM变量,它只能在运算符中通过向运算符构造函数提供provide_context=True参数来提供。

如果您想在DAG结构中使用来自操作员的数据,则需要执行操作员在操作员外部执行的实际任务。

def get_file_list():
    hook = SomeHook()
    hook.run('something to get file list')

dag = DAG('tutorial', default_args=default_args)

for file in get_file_list():
    task = SomeOperator(params={'file': file}) # Do something with the file passed as a parameter

答案 1 :(得分:0)

从dag本身而不是dag中的任务访问xcom通常是一种不好的做法。也就是说,有时是必要的。例如,在动态创建dag时可能需要执行此操作。

这是我在拖延中拉出一些未执行的工作的示例。我在subdag的上下文中使用它,因此可以放心,假设该方法正在运行,xcom将始终包含该信息。

    xcom_unrun_jobs = None
    if len(parent_dag.get_active_runs()) > 0:
        tis = parent_dag.get_task_instances(settings.Session, start_date=parent_dag.get_active_runs()[-1])[-1]
        xcom_unrun_jobs = tis.xcom_pull(dag_id=parent_dag._dag_id, task_ids=unrun_job_task_id)