Python 在dag运行之前,标记任务成功或跳过它

Python 在dag运行之前,标记任务成功或跳过它,python,airflow,google-cloud-composer,Python,Airflow,Google Cloud Composer,我们有一个巨大的DAG,有许多小而快速的任务和一些大而耗时的任务 我们只想运行DAG的一部分,最简单的方法是不添加我们不想运行的任务。问题是,我们的DAG有许多相互依赖关系,因此当我们想跳过一些任务时,不破坏DAG就成了一个真正的挑战 默认情况下,有没有一种方法可以将状态添加到任务中?(每次跑步),类似于: # get the skip list from a env variable task_list = models.Variable.get('list_of_tasks_to_s

我们有一个巨大的DAG,有许多小而快速的任务和一些大而耗时的任务

我们只想运行DAG的一部分,最简单的方法是不添加我们不想运行的任务。问题是,我们的DAG有许多相互依赖关系,因此当我们想跳过一些任务时,不破坏DAG就成了一个真正的挑战

默认情况下,有没有一种方法可以将状态添加到任务中?(每次跑步),类似于:

# get the skip list from a env variable    
task_list = models.Variable.get('list_of_tasks_to_skip')

dag.skip(task_list)


如注释中所述,您应该使用
BranchPythonOperator
(或
ShortCircuitOperator
)来防止执行耗时的任务。如果需要运行这些耗时任务的下游操作符,可以使用
TriggerRule.ALL_DONE
运行这些操作符,但请注意,即使上游操作符失败,也会运行这些操作符

您可以使用气流变量影响这些
分支操作器
,而无需更新DAG,例如:

from airflow.models import Variable

def branch_python_operator_callable()
  return Variable.get('time_consuming_operator_var')

并使用
branch\u python\u operator\u callable
作为您的branchpython operator的python可调用项。

如果您将所有不关心的任务都标记为成功,而不在每次运行时都执行,那么是什么阻止您完全从DAG中删除这些任务呢?@BenGregory我们经常以“完整运行”的方式运行DAG,但有时一些任务失败,我们只想运行dag的一些部分。相互依赖树是巨大的,简单地删除任务通常会破坏DAG。因此,我们希望将所有dag标记为“成功”,除了所需的任务及其依赖项。好的-我不确定在评估任务之前,如何在默认情况下将其设置为特定状态。大体上说,如果您运行的是一个大型DAG,大多数时间只需要运行某些部分,我建议您在不同的时间点使用BranchPythonOperator()来确定要执行哪些下游任务以及要跳过哪些任务。@Pablo您能解决这个问题吗?我可以想到的另一种方法是将所有需要重新运行的部分移出主DAG,并将它们作为独立的顶级DAG进行建模。现在,在主DAG中,您可以使用
ShortCircuitOperator
BranchPythonOperator
触发器DAGRonOperator
将它们连接起来。这种方法存在的问题是,如果您还有更多的部件需要在这些小型顶级DAG之后运行,那么您将需要类似于
ExternalTaskSensor
的东西来等待这些小型DAG的完成以触发它们。Untidy@y2k-shubham是的,我们使用了有点复杂的变通方法,但对我们的问题很有用。正如您在主要问题中所看到的,我们正在寻找使用
env var
(动态)修改dag的方法,我们没有找到跳过气流中的任务的方法,但我们意识到可以基于
env var
创建dag。我们所有的任务基本上是相同的,因此我们根据保存在env-var中的任务列表在循环中创建它们。然后,当我们想要跳过一些任务时,我们使用图形算法修改该var。希望能有所帮助。对于每个任务(或dag执行的每个组合),我们都希望避免(如果可能的话)使用开关
BranchPythonOperator
ShortCircuitOperator
。同样,对于每种执行类型都有一个dag(考虑到任务的相互依赖性)。有没有一种方法可以将任务保留在dag中,但跳过它们?或者仅仅给他们一个属性就将他们标记为成功?我正在寻找类似的解决方案。我必须创建任务,这样它仍然可以在UI中可见,但同时我想将其标记为跳过。
from airflow.models import Variable

def branch_python_operator_callable()
  return Variable.get('time_consuming_operator_var')