简体   繁体   English

Airflow - TriggerDagRunOperator - 使用不同的 Conf 调用相同的 DAG

[英]Airflow - TriggerDagRunOperator - Call same DAG with different Conf

I've one dynamic DAG (dag_1) that is orchestrated by another DAG (dag_0) using TriggerDagRunOperator.我有一个动态 DAG (dag_1),它由另一个 DAG (dag_0) 使用 TriggerDagRunOperator 编排。

The dag_1 is a very simple script: `from datetime import datetime from airflow.models import DAG from airflow.operators.python_operator import PythonOperator dag_1 是一个非常简单的脚本:`from datetime import datetime from airflow.models import DAG from airflow.operators.python_operator import PythonOperator

default_args = { 'provide_context': True, } default_args = { 'provide_context': True, }

def get_list(**context): p_list = ['a','b','c'] res = context["dag_run"].conf['message'] p_list.append(res) return p_list def get_list(**context): p_list = ['a','b','c'] res = context["dag_run"].conf['message'] p_list.append(res) return p_list

with DAG( dag_id='dag_1', schedule_interval='@once', start_date=datetime(2022, 3, 1) , default_args=default_args ) as dag: data_list = PythonOperator( task_id='get_lists', python_callable=get_list, dag=dag) for i in get_list(): bash_task = BashOperator(task_id='bash_task_{}'.format(i), bash_command="echo 'command executed {}'.format(i)") with DAG( dag_id='dag_1', schedule_interval='@once', start_date=datetime(2022, 3, 1) , default_args=default_args ) as dag: data_list = PythonOperator( task_id='get_lists', python_callable=get_list, dag=dag) for i in get_list(): bash_task = BashOperator(task_id='bash_task_{}'.format(i), bash_command="echo 'command executed {}'.format(i)")

And my dag_0 that will run orchestrate the dag_1 based on the parameters passed: `from airflow.operators.trigger_dagrun import TriggerDagRunOperator from datetime import datetime from airflow import DAG And my dag_0 that will run orchestrate the dag_1 based on the parameters passed: `from airflow.operators.trigger_dagrun import TriggerDagRunOperator from datetime import datetime from airflow import DAG

dag = DAG( 'dag_0', description='create the table structure', schedule_interval='@once', catchup=False, max_active_runs=1, start_date=datetime(2022, 3, 1) ) dag = DAG( 'dag_0', description='create the table structure', schedule_interval='@once', catchup=False, max_active_runs=1, start_date=datetime(2022, 3, 1) )

trigger_step = TriggerDagRunOperator( task_id="trigger_step", trigger_dag_id="dag_1", conf={"message": "Hello Word 1"}, dag=dag ) trigger_step = TriggerDagRunOperator( task_id="trigger_step", trigger_dag_id="dag_1", conf={"message": "Hello Word 1"}, dag=dag )

trigger_step2 = TriggerDagRunOperator( task_id="trigger_step2", trigger_dag_id="dag_1", conf={"message": "Hello Word 2"}, dag=dag ) trigger_step2 = TriggerDagRunOperator( task_id="trigger_step2", trigger_dag_id="dag_1", conf={"message": "Hello Word 2"}, dag=dag )

trigger_step >> trigger_step2`

If I run this without the need to pass the PythonOperator to a list, it works fine by when I put that part "for i in get_list()" on first script I got: res = context["dag_run"].conf['message'] KeyError: 'dag_run'如果我在不需要将 PythonOperator 传递给列表的情况下运行它,当我将那部分“for i in get_list()”放在我得到的第一个脚本上时它工作正常: res = context["dag_run"].conf['message'] KeyError: 'dag_run'

What I am doing wrong?我做错了什么?

Try the below.试试下面的。 I think because that dag_run object is created at run time.我认为是因为dag_run object 是在运行时创建的。

def get_list(dag_run=None,**context): 
    p_list = ['a','b','c'] 
    res = dag_run.conf.get('message') 
    p_list.append(res) 
    return p_list

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM