Python subDAG在气流中究竟是如何工作的?启用子DAG意味着什么?

Python subDAG在气流中究竟是如何工作的?启用子DAG意味着什么?,python,airflow,Python,Airflow,我已经查看了Airflow subDAG部分,并试图在网上找到任何其他有用的内容,但是我没有找到任何详细说明如何使subDAG工作的内容。运行子DAG的要求之一是应启用它。如何启用/禁用子DAG 我编写了一些示例代码,其中没有显示气流中的任何错误,但是当我尝试运行它时,子DAG中的任何操作符都不会执行 这是我的主要dag代码: import os from airflow import DAG from airflow.operators import BashOperator from dat

我已经查看了Airflow subDAG部分,并试图在网上找到任何其他有用的内容,但是我没有找到任何详细说明如何使subDAG工作的内容。运行子DAG的要求之一是应启用它。如何启用/禁用子DAG

我编写了一些示例代码,其中没有显示气流中的任何错误,但是当我尝试运行它时,子DAG中的任何操作符都不会执行

这是我的主要dag代码:

import os
from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
from airflow.operators.subdag_operator import SubDagOperator
from linecount_subdag import sub_dag

parent_dag_name = 'example_linecount_dag'
child_dag_name = 'example_linecount_subdag'

args = {
    'owner': 'airflow',
    'start_date': datetime(2016, 04, 20),
    'retries': 0,
}
main_dag = DAG(
    dag_id=parent_dag_name,
    default_args=args,
    schedule_interval=timedelta(minutes=5),
    start_date=datetime(2016, 04, 20),
    max_active_runs=1
)

subdag = SubDagOperator(
    subdag=sub_dag(parent_dag_name, child_dag_name, args, main_dag.schedule_interval),
    task_id=child_dag_name,
    default_args=args,
    dag=main_dag)
t = BashOperator(
    task_id='start',
    bash_command='echo "waiting for subdag..."',
    default_args=args,
    dag=main_dag)
t.set_downstream(subdag)
在这段代码中,任务“start”成功,但是subdag任务什么都不做,既没有失败也没有成功

这是我的子DAG代码:

from airflow.models import DAG
from airflow.operators import BashOperator

# Dag is returned by a factory method
def sub_dag(parent_dag_name, child_dag_name, args, schedule_interval):
  dag = DAG(
    '%s.%s' % (parent_dag_name, child_dag_name),
    default_args=args,
    start_date=args['start_date'],
    max_active_runs=1,
  )
  t1 = BashOperator(
    task_id='count_lines',
    bash_command='cat /root/airflow/airflow.cfg | wc -l',
    default_args=args,
    xcom_push=True,
    dag=dag)
  t2 = BashOperator(
    task_id='retrieve_val',
    bash_command='grep "airflow_home" /root/airflow/airflow.cfg',
    default_args=args,
    xcom_push=True,
    dag=dag)
  templated_command = """
    {
        echo "{{ ti.xcom_pull(task_ids='count_lines') }}"
        echo "{{ ti.xcom_pull(task_ids='retrieve_val') }}"
    }"""
  t3 = BashOperator(
    task_id='print_values',
    bash_command=templated_command,
    default_args=args,
    dag=dag)
  t3.set_upstream(t1)
  t3.set_upstream(t2)
  return dag
此代码中的3个运算符获取文件“airflow.cfg”的行数,在该文件中找到“airflow_home”的值,并返回要打印的这两个值。这段代码是独立工作的,所以我认为这不是问题所在


要使子DAG执行其运算符,我必须做哪些更改?

我在本地使用了您的代码,它工作正常

我唯一更改的是将外部dag和子dag设置为schedule_interval=None,并手动触发它们

开始日期为datetime(2016,04,20)且计划间隔为5分钟将淹没气流调度器,并发出许多回填请求

您可能需要从使用LocalExecutor切换到CeleryExecutor。LocalExecutor相当有限

下面是子DAG中最后一步的输出:

[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:       {
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:           echo "226"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:           echo "airflow_home = /root/airflow/"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask:       }

你发现了吗?子DAG在
'%s.%s%%(父DAG\u名称,子DAG\u名称)
之前也丢失了
DAG\u id=
。如@sage88所述,
气流1.8+/code>默认提供了一个(布尔)配置
catchup\u
(对应的
DAG
参数
catchup
)覆盖默认回填行为的步骤