首页 > 解决方案 > 动态任务组与动态 DAG

问题描述

假设我有一个任务流程:

T1 >> T2 >> T3

该过程需要针对一组 id [1,2,3] 运行:

process_run_with_id1

process_run_with_id2

process_run_with_id3

我可以创建具有多个任务组的单个 DAG,其中每个任务组代表要为 id 运行的任务集:

DAG = > TG_for_1, TG_for_2, TG_for_3

或多个 DAG

DAG_for_1 = t1 >> t2 >> t3

DAG_for_2 = t1 >> t2 >> t3  

DAG_for_3 = t1 >> t2 >> t3

除了视觉上的不同之外,这两种方法之间有什么区别(以及我是通过让文件创建 DAG 还是拥有多个 DAG 文件来动态创建 DAG)?

标签: airflow-schedulerairflow

解决方案


您可以通过跨 DAG 拆分任务或将它们加入单个 DAG 来获得相同的结果,但这更多地是您定义结果的方式。您也可以在单个文件中编写整个软件,但将所有内容放在同一个文件中是否明智?可能不是。

有一些规则可以帮助您区分添加任务组和创建单独的 DAG。

支持将具有任务组的任务添加到当前 DAG 的要点:

  1. 任务是 DAG 的一个子单元。
  2. 组中的任务永远不会单独执行。执行始终是 DAG 本身的一部分。
  3. 这些任务与 DAG 共享相似/紧密的业务逻辑,因此在特定 DAG 中查找这些任务是有意义的。

支持将任务从当前 DAG 分离到另一个 DAG 的要点:

  1. 任务可能需要与当前 DAG 分开运行。
  2. 任务代表一个单独的业务单元,它可能是独立的,也可能在当前 DAG 之后执行。
  3. 任务中的代码更改不需要对当前 DAG 进行任何额外的更改。

总的来说,我认为最重要的一点是,虽然任务组只是一个漂亮的 UI 表示。这意味着如果由于任何原因TG_for_1需要更长的执行时间,它可能会导致调度新 DAG 运行的延迟,这意味着它不仅会影响其中的任务,还会影响&TG_for_1的后续运行的任务,这些任务将被延迟。因此,只有当它们将一起运行并在出现问题时一起“受苦”时才有意义,您才希望将这些任务“绑定”到同一个 DAG 中。TG_for_2TG_for_3


推荐阅读