我有一个子标记作为主DAG的一个节点。工作流程正常。
我尝试通过在子标记内包含另一个子标记来提高层次结构的级别。但气流似乎变得混乱。在这方面有几个问题:
1)气流是否支持子标记内的子标记?如果是这样,层次结构是否有限制?
2)在子标记中使用子标记是否有最佳实践?
答案 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)