Apache Airflow-如何在使用TriggerDagRunOperator触发的流中在运算符外部检索dag_run数据

时间:2018-08-07 16:49:22

标签: airflow google-cloud-composer

我设置了两个DAG,我们称第一个为编排器,第二个为工作器。 Orchestrator的工作是从API检索一个列表,并对该列表中的每个元素使用一些参数触发工作程序DAG。

我将两个工作流程分开的原因是我希望只重播失败的“工作”工作流程(如果一个工作流程失败,我不想重播所有工作程序实例)。

我能够使事情正常进行,但是现在我看到了监视的难度,因为我的task_id对所有人来说都是相同的,所以我决定基于“ orchestrator”工作流程从API检索的值来获得动态task_id

但是,我无法从运算符外部的dag_run对象中检索值。基本上,我想这样做:

with models.DAG('specific_workflow', schedule_interval=None, default_args=default_dag_args) as dag:
    name = context['dag_run'].name
    hello_world = BashOperator(task_id='hello_{}'.format(name), bash_command="echo Hello {{ dag_run.conf.name }}", dag=dag)
    bye = BashOperator(task_id='bye_{}'.format(name), bash_command="echo Goodbye {{ dag_run.conf.name }}", dag=dag)

    hello_world >> bye

但是我无法定义此“上下文”对象。但是,我可以从运算符(例如PythonOperator和BashOperator)访问它。

是否可以在运算符之外检索dag_run对象?

1 个答案:

答案 0 :(得分:0)

我认为目前尚不容易。例如,作为工作程序运行过程的一部分,除了在哪里可以找到DAG之外,没有提供任何TaskInstance上下文的情况下检索DAG:https://github.com/apache/incubator-airflow/blob/f18e2550543e455c9701af0995bc393ee6a97b47/airflow/bin/cli.py#L353

稍后会注入上下文:https://github.com/apache/incubator-airflow/blob/c5f1c6a31b20bbb80b4020b753e88cc283aaf197/airflow/models.py#L1479

DAG的run_id是存储此信息的好地方。