气流:可以在另一个子标签内运行子标记吗?

时间:2017-02-15 10:15:57

标签: airflow

我有一个子标记作为主DAG的一个节点。工作流程正常。

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

1)气流是否支持子标记内的子标记?如果是这样,层次结构是否有限制?

2)在子标记中使用子标记是否有最佳实践?

3 个答案:

答案 0 :(得分:1)

我最近开始自己使用Airflow,Airflow确实支持在子标签内部使用子标记。我能够达到4级深度,但我不确定层次结构的确切限制。希望有所帮助!

答案 1 :(得分:0)

简短回答是的,可以。 我设法通过在https://github.com/geosolutions-it/evo-odas/wiki/Airflow---about-subDAGs,-branching-and-xcom之后使用subdag create函数来实现此目的 我实现了subdag层次结构的3个级别。 技巧是要非常小心,在您的任务中遵循maindag.subdag表示法。

task = SubDagOperator(
    subdag=create_subdag(dag_name, task_id, datetime(2019, 1, 29) , None),
    task_id=task_id,
    dag=dag
    )

在create_subdag函数中,您需要仔细处理父级和子级dags名称,嵌套几个这样的函数即可。 您会在用户界面中看到错误(如果有)。 如果需要,我将用更多代码更新此帖子,但这实际上取决于所需的级别,因此您需要设计类似的功能。

答案 2 :(得分:0)

我最近开始试验subdags。我认为他们能走多深没有限制。由于连接池存在问题,很多网页建议不要使用subdags。

我举了一个here的示例,分为两个级别。它可以进一步重构,但可以证明这一点。

1)创建一个帮助程序方法,以创建其子日期名称格式为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)然后以递归方式创建子subdag并将其分配给父dag。请记住,子类别仍然是DAG。 SubDagOperator仅将其捆绑为父级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)