Airflow 无论上游任务状态如何,都执行任务

Airflow 无论上游任务状态如何,都执行任务,airflow,directed-acyclic-graphs,airflow-operator,Airflow,Directed Acyclic Graphs,Airflow Operator,我有一个相对简单的DAG定义如下: set_variables >> create_conf_file >> check_running_job >> transform_data >> update_variables create_conf_file >> remove_conf_file check_running_stat_job >> remove_conf_file transform_openidm_data

我有一个相对简单的DAG定义如下:

set_variables >> create_conf_file >> check_running_job >> transform_data >> update_variables
create_conf_file >> remove_conf_file
check_running_stat_job >> remove_conf_file
transform_openidm_data >> remove_conf_file
update_orc_file_variable >> remove_conf_file
我的目标是确保无论以前所有任务的状态如何,始终执行
remove\u conf\u file

我曾尝试使用
trigger\u rule=TriggerRule。在我的
PythonOperator
调用中,所有任务都已完成,但是
remove\u conf\u file
仅在之前的所有任务都完成时才执行。
如果任务
check\u running\u stat\u job
失败,则不会执行
remove\u conf\u file
任务

我希望无论上游任务的状态是“完成”、“失败”还是“未完成”,都能删除该文件

我尝试了几种DAG配置,但似乎都不起作用

[编辑]
以下是气流中的DAG树视图和DAG视图:


我已复制了图像中显示的任务结构,并在任务
spark\u etl
失败后成功运行了任务
删除配置文件

关键是将
trigger\u rule='all\u done'
添加到
remove\u conf\u文件
任务中。这并不意味着所有上游任务都需要成功执行,只是需要完成它们(不管成功与否)。我使用了BashOperator,而不是你在问题中提到的Python操作符

它包含与DAG对应的dockerfile


编辑:

为了便于参考,如果我们想测试
spark_etl
任务失败以及后续成功执行
remove_conf_file
任务,下面是成功代码的样子:

t4 = BashOperator(
    task_id='spark_etl',
    bash_command='exit 123"',          # simulation of task failure
    dag=dag)
    
t6 = BashOperator(
    task_id='remove_conf_file',
    bash_command='echo "Task 6"',
    dag=dag,
    trigger_rule='all_done')

(完整的代码可以在上面提到的我的git存储库中找到。)

你能分享DAG的截图吗?DAG中似乎有两个断开连接的组件。这是真的吗?另外,您是否希望在完成/失败/跳过的任何上游任务完成后立即运行
remove_conf_file
?@MohammedKashif我添加了图片。我希望在
创建\u conf\u文件
更新\u变量
之间的所有操作正常或任何操作失败时
删除\u文件
。或者其他任何事情,如果一个任务没有失败,或者没有发生任何变化,那么最终需要删除文件。您可以检查上游任务是否已达到任何成功、跳过、上游失败或失败状态?我的观点是,如果我的任何任务因某种原因失败,请尝试最后执行某项操作,但如果check_running_config_stat_job失败,则不会触发start_etl,也不会触发remove_conf_files,我会尝试,但正如您所说,它需要执行,如果任务失败,则不会执行下游任务。但我会试试的,我很好奇。谢谢你的更新。实际上,我的意思是,使用
trigger\u rule='all\u done'
,即使
spark\u etl
任务失败,也可以成功执行
remove\u conf\u文件。关键字'all done'令人困惑,因为它听起来像失败或跳过了,但不算作'done'。但在本例中,“完成”的意思类似于“完成运行(或尝试运行)任务”(无论任务状态如何)。我现在知道当任务不工作时,只要任务失败,DAG就会标记为重试,并且只有最后一次重试才会结束。我很确定这就是我的问题所在。我会尝试并确认,如果是这样,我会在github上打开一个问题,因为我认为这很重要