如何不根据条件在DAG中显示任务

时间:2019-09-29 02:32:20

标签: airflow

我有一个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。

enter image description here

1 个答案:

答案 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