Airflow 如何基于条件不在DAG中显示任务

Airflow 如何基于条件不在DAG中显示任务,airflow,Airflow,我有一个DAG,里面有3个任务。我不希望基于条件在DAG运行中显示第二个任务(中间名称)。例如,如果middle_name_var=='false',我不想在DAG中显示middle_name任务。有没有办法优雅地实现这一点 from airflow.operators import PythonOperator from airflow.operators.python_operator import BranchPythonOperator from airflow.operators.du

我有一个DAG,里面有3个任务。我不希望基于条件在DAG运行中显示第二个任务(中间名称)。例如,如果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

我的DAG与middle_name task类似……但我不希望基于middle_name_var的middle_name task,在本例中该变量设置为false


参考最后一组链接语句

# 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
让我问你:如果删除这些链接语句,会发生什么?任务会从DAG中消失吗

不完全是


链接只是在任务之间建立依赖关系。即使没有链接,你的任务仍然是DAG的一部分(就像你发布的截图)

这里有一个秘密:一项任务一旦你宣布就成为你的dag的一部分

middle_name_task = PythonOperator(
    task_id='middle_name',
    provide_context=False,
    python_callable=middle_name,
    dag=dag
)
无论您是否将该任务设置为其他任务的上游或下游,它都将继续“显示”在DAG中。在这方面引用

操作员不必立即分配给DAG(以前 dag是必需的参数)。但是,一旦操作员被分配到 DAG,它不能被转移或取消分配。DAG分配可以是 在创建运算符时,通过延迟 赋值,甚至从其他运算符推断


  • Q那么您应该如何“不显示”任务

    A只是不声明(实例化)它

  • Q你会怎么做

    只需将任务声明移动到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