Python 如何使用条件任务运行DAG

Python 如何使用条件任务运行DAG,python,apache,airflow,directed-acyclic-graphs,Python,Apache,Airflow,Directed Acyclic Graphs,总共有6个任务。这些任务需要根据输入json中的一个字段(标志值)值执行。 如果flag_value的值为真,则所有任务都需要以如下方式执行:, 首先是task1,然后是Parallel to(task2和task3一起),Parallel to task4,Parallel to task5。 所有这些完成后,任务6。 因为我不熟悉气流和DAG,所以我不知道如何在这种情况下跑步 如果flag_value的值为false,则顺序仅为顺序 任务1>>任务4>>任务5>>任务6 下面是我的DAG代码

总共有6个任务。这些任务需要根据输入json中的一个字段(标志值)值执行。 如果flag_value的值为真,则所有任务都需要以如下方式执行:, 首先是task1,然后是Parallel to(task2和task3一起),Parallel to task4,Parallel to task5。 所有这些完成后,任务6。 因为我不熟悉气流和DAG,所以我不知道如何在这种情况下跑步

如果flag_value的值为false,则顺序仅为顺序
任务1>>任务4>>任务5>>任务6

下面是我的DAG代码

from airflow import DAG
from datetime import datetime
from airflow.providers.databricks.operators.databricks import DatabricksSubmitRunOperator


default_args = {
    'owner': 'airflow',
    'depends_on_past': False
}

dag = DAG('DAG_FOR_TEST',default_args=default_args,schedule_interval=None,max_active_runs=3, start_date=datetime(2020, 7, 8)) 


#################### CREATE TASK #####################################   

task_1 = DatabricksSubmitRunOperator(
    task_id='task_1',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',
    libraries= [
        {
        'jar': 'dbfs:/task_1/task_1.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_1.driver.TestClass1',
        'parameters' : [
            '{{ dag_run.conf.json }}'       
        ]
    }
)



    
task_2 = DatabricksSubmitRunOperator(
    task_id='task_2',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',   
    libraries= [
        {
        'jar': 'dbfs:/task_2/task_2.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_2.driver.TestClass2',
        'parameters' : [
            '{{ dag_run.conf.json }}'                               
        ]
    }
)
    
task_3 = DatabricksSubmitRunOperator(
    task_id='task_3',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',   
    libraries= [
        {
        'jar': 'dbfs:/task_3/task_3.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_3.driver.TestClass3',
        'parameters' : [
            '{{ dag_run.conf.json }}'   
        ]
    }
) 

task_4 = DatabricksSubmitRunOperator(
    task_id='task_4',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',
    libraries= [
        {
        'jar': 'dbfs:/task_4/task_4.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_4.driver.TestClass4',
        'parameters' : [
            '{{ dag_run.conf.json }}'   
        ]
    }
) 

task_5 = DatabricksSubmitRunOperator(
    task_id='task_5',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',
    libraries= [
        {
        'jar': 'dbfs:/task_5/task_5.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_5.driver.TestClass5',
        'parameters' : [
            'json ={{ dag_run.conf.json }}' 
        ]
    }
) 

task_6 = DatabricksSubmitRunOperator(
    task_id='task_6',
    databricks_conn_id='connection_id_details',
    existing_cluster_id='{{ dag_run.conf.clusterId }}',
    libraries= [
        {
        'jar': 'dbfs:/task_6/task_6.jar'
        }        
        ],
    spark_jar_task={
        'main_class_name': 'com.task_6.driver.TestClass6',
        'parameters' : ['{{ dag_run.conf.json }}'   
        ]
    }
) 


flag_value='{{ dag_run.conf.json.flag_value }}'

#################### ORDER OF OPERATORS ###########################  

if flag_value == 'true':
    
    task_1.dag = dag
    task_2.dag = dag
    task_3.dag = dag
    task_4.dag = dag
    task_5.dag = dag
    task_6.dag = dag
    
    task_1  >> [task_2 , task_3] >> [task_4] >> [task_5]  >> task_6    // Not sure correct 
else:
    task_1.dag = dag
    task_4.dag = dag
    task_5.dag = dag
    task_6.dag = dag
    
    task_1 >> task_4 >> task_5 >> task_6

    

        
        
    

首先,依赖关系是不正确的,应该这样做:

task_1 >> [task_2 , task_3] >> task_4 >> task_5  >> task_6
无法使用
list\u 1>>list\u 2
对任务进行排序,但有一些帮助器方法可以提供此功能,请参阅:

对于分支,您可以使用
BranchPythonOperator
更改任务。不确定下面的代码,它可能有一些小错误,但这里的想法是可行的

task_4.trigger_rule = "none_failed"

dummy = DummyOperator(task_id="dummy", dag=dag)

branch = BranchPythonOperator(
    task_id="branch",
    # jinja template returns string "True" or "False"
    python_callable=lambda f: ["task_2" , "task_3"] if f == "True" else "dummy",
    op_kwargs={"f": flag_value},
    dag=dag)

task_1 >> branch
branch >> [task_2 , task_3, dummy] >> task_4
task_4 >> task_5 >> task_6

有更好的方法可以做到这一点。

首先,依赖性是不正确的,这应该是可行的:

task_1 >> [task_2 , task_3] >> task_4 >> task_5  >> task_6
无法使用
list\u 1>>list\u 2
对任务进行排序,但有一些帮助器方法可以提供此功能,请参阅:

对于分支,您可以使用
BranchPythonOperator
更改任务。不确定下面的代码,它可能有一些小错误,但这里的想法是可行的

task_4.trigger_rule = "none_failed"

dummy = DummyOperator(task_id="dummy", dag=dag)

branch = BranchPythonOperator(
    task_id="branch",
    # jinja template returns string "True" or "False"
    python_callable=lambda f: ["task_2" , "task_3"] if f == "True" else "dummy",
    op_kwargs={"f": flag_value},
    dag=dag)

task_1 >> branch
branch >> [task_2 , task_3, dummy] >> task_4
task_4 >> task_5 >> task_6

可能还有更好的方法。

非常感谢@mustafagok给出的答案。但我需要的是第一个任务1需要运行。在这之后,4个任务需要以并行方式运行(task2和task3一起),并行到task4,并行到task5。所有这些完成后,task6需要运行。第一个task_1正在运行。从那以后我就不明白了。但是您可以很容易地更改顺序或进行操作,只需尝试并查看图表视图,如果不正确,请更改。我可以试着帮助你,如果你描述的图纸,或更详细。2-3-4和5都是并行的吗?Task1并行-->[Task2&Task3]并行-->Task4并行-->Task5毕竟执行了task6不确定,你说的带箭头的并行是什么意思。if 2-3-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(代码)任务1>>分支>[任务2,任务4,任务5]
任务3
[task 3,任务4,任务5]>任务6
如果您尝试不同版本,您将找到所需的图表。非常感谢@mustafagok提供的答案。但我需要的是第一个任务1需要运行。在这之后,4个任务需要以并行方式运行(task2和task3一起),并行到task4,并行到task5。所有这些完成后,task6需要运行。第一个task_1正在运行。从那以后我就不明白了。但是您可以很容易地更改顺序或进行操作,只需尝试并查看图表视图,如果不正确,请更改。我可以试着帮助你,如果你描述的图纸,或更详细。2-3-4和5都是并行的吗?Task1并行-->[Task2&Task3]并行-->Task4并行-->Task5毕竟执行了task6不确定,你说的带箭头的并行是什么意思。if 2-3-4-5并行:if 2-3-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:if(2&3)-4-5并行:
task 1>>分支>[task 2,task 4,task 5]
task 2,task 2>>task 3
[task 3,task 4,task 5]>task 6
如果您尝试不同版本,您将需要找到图表。