我有一个DAG,其中有3个任务。我不希望根据条件在DAG运行中显示第二个任务(middle_name)。例如如果middle_name_var =='false',我不想在DAG中显示middle_name任务。有没有办法优雅地实现这一目标?
from airflow.operators import PythonOperator
from airflow.operators.python_operator import BranchPythonOperator
from airflow.operators.dummy_operator import DummyOperator
from datetime import datetime, timedelta
from airflow.models import Variable
middle_name_var = Variable.get('middle_name')
default_args = {
'owner': 'test',
'depends_on_past': False,
'start_date': datetime(2018, 6, 18),
'email': ['tes@abc.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=1)
}
dag = DAG(
'name',
default_args=default_args,
schedule_interval="@once")
def first_name():
print('John')
def middle_name():
print('Smith')
def last_name():
print('Doe')
first_name_task = PythonOperator(
task_id='first_name',
provide_context=False,
python_callable=first_name,
dag=dag
)
middle_name_task = PythonOperator(
task_id='middle_name',
provide_context=False,
python_callable=middle_name,
dag=dag
)
last_name_task = PythonOperator(
task_id='last_name',
provide_context=False,
python_callable=last_name,
dag=dag
)
if middle_name_var == 'true':
first_name_task >> middle_name_task >>last_name_task
else:
first_name_task >> last_name_task
MY DAG的Middle_name任务看起来像这样...但是我不希望基于Middle_name_var创建Middle_name任务,在这种情况下将其设置为false。
答案 0 :(得分:2)
参考最后一组 chaining 语句
# by the way i believe the comparison expression should be
# middle_name_var == True (boolean rather than string), but lets ignore it for now
if middle_name_var == 'true':
first_name_task >> middle_name_task >>last_name_task
else:
first_name_task >> last_name_task
我问你:如果删除这些 chaining 语句会发生什么?任务会从DAG中消失吗?
不太。
链仅建立任务之间的依赖关系。即使没有链接,您的任务仍将保留在DAG中(如您发布的屏幕快照中一样)。
这是秘密所在:任务一声明就成为dag的一部分
middle_name_task = PythonOperator(
task_id='middle_name',
provide_context=False,
python_callable=middle_name,
dag=dag
)
无论您是否将该任务设置为其他任务的上游或下游,它都将继续“出现”在DAG中。在这方面引用docs
不必立即将操作员分配给DAG(以前 dag是必需的参数)。但是,一旦将操作员分配给 DAG,不能转让或未分配。 DAG分配可以是 在创建运算符时,通过延迟明确完成 分配,甚至可以从其他运营商那里推断出来。
Q 那么您应该怎么做才能“不显示”任务?
A 只是不声明(实例化)。
问,您将如何去做?
A 只需将任务声明移到if-else子句中
if middle_name_var == 'true': middle_name_task = PythonOperator( task_id='middle_name', provide_context=False, python_callable=middle_name, dag=dag ) first_name_task >> middle_name_task >>last_name_task else: first_name_task >> last_name_task