Airflow 气流:子DAG是否可以在另一个子DAG内运行?

Airflow 气流:子DAG是否可以在另一个子DAG内运行?,airflow,Airflow,我有一个子DAG作为主DAG的节点之一。工作流程运行良好 我试图通过在子DAG中包含另一个子DAG来提高层次结构的级别。但气流似乎变得混乱。在这方面有几个问题: 1) 气流是否支持subdag内部的subdag?如果是,层次结构是否有限制 2) 在子DAG中使用子DAG有什么最佳实践吗?我最近开始使用气流,气流确实支持在子DAG中使用子DAG。我能够深入到4级,但我不确定层次结构的确切限制。希望有帮助 简短回答是的,你可以。 我通过使用subdag create函数实现了这一点 我实现了3级子D

我有一个子DAG作为主DAG的节点之一。工作流程运行良好

我试图通过在子DAG中包含另一个子DAG来提高层次结构的级别。但气流似乎变得混乱。在这方面有几个问题:

1) 气流是否支持subdag内部的subdag?如果是,层次结构是否有限制


2) 在子DAG中使用子DAG有什么最佳实践吗?

我最近开始使用气流,气流确实支持在子DAG中使用子DAG。我能够深入到4级,但我不确定层次结构的确切限制。希望有帮助

简短回答是的,你可以。 我通过使用subdag create函数实现了这一点 我实现了3级子DAG层次结构。 诀窍是在任务中非常小心地遵循maindag.subdag符号

task = SubDagOperator(
    subdag=create_subdag(dag_name, task_id, datetime(2019, 1, 29) , None),
    task_id=task_id,
    dag=dag
    )
在create_subdag函数中,您需要仔细处理父DAG和子DAG名称,嵌套几个这样的函数就可以了。 您将在UI中看到错误(如果有)。
如果需要的话,我会用更多的代码来更新这篇文章,但这实际上取决于你需要多少级别,所以你可以这样设计函数

我最近开始试验subdag。我不认为他们能走多远是有限制的。由于连接池的问题,许多网页建议远离子DAG

我举了一个2级的例子。它可以进一步重构,但它证明了这一点

1) 创建一个助手方法,以创建子DAG名称格式为parent.child的DAG

def create_sub_dag(parent_dag_name, child_dag_name, start_date, schedule_interval):
  ''''Returns a DAG which has the dag_id formatted as parent.child '''
  return DAG(
    dag_id='{}.{}'.format(parent_dag_name, child_dag_name),
    schedule_interval=schedule_interval,
    start_date=start_date,
    max_active_runs=15
  )
2) 然后递归地创建子DAG并将其指定给父DAG。记住,子DAG仍然是DAG。SubDAG操作符仅将其捆绑为父dag的任务

level1_list = ['AWS', 'AZURE']
level2_list = ['eu', 'us', 'ap', 'jp']
tasks = ['task_{}'.format(str(i)) for i in range(0, 10)]

for level1_item in level1_list:
    level1_dag = create_sub_dag(dag_id, level1_item, datetime(2020, 3, 10), '0 6 * * *')
    level1_subdag_operator = SubDagOperator(
      subdag=level1_dag,
      task_id=level1_item,
      dag=dag,
    )

    level1_dag_id = '{}.{}'.format(dag_id, level1_item)
    for level2_item in level2_list:
        level2_dag = create_sub_dag(level1_dag_id, level2_item, datetime(2020, 3, 10), '0 6 * * *')
        level2_subdag_operator = SubDagOperator(
          subdag=level2_dag,
          task_id=level2_item,
          dag=level1_dag,
        )
        level2_dag_id = '{}.{}.{}'.format(dag_id, level1_item, level2_item)
        create_tasks(level2_dag, tasks)

你能分享一下你是如何做到这一点的吗?