Python 气流调度器是否可以先在前一天完成';在开始下一个循环之前,先进行循环?

Python 气流调度器是否可以先在前一天完成';在开始下一个循环之前,先进行循环?,python,apache,python-3.x,scheduler,airflow,Python,Apache,Python 3.x,Scheduler,Airflow,现在,我的DAG中的节点在该DAG的其余节点完成之前进入第二天的任务。有没有办法让它等待DAG的其余部分完成,然后再进入第二天的DAG周期 (我确实将dependens_on_past视为true,但在这种情况下不起作用) 我的DAG看起来像这样: O l V O -> O -> O -> O -> O dag = DAG(dag_id='TEST_DAG', default_ar

现在,我的DAG中的节点在该DAG的其余节点完成之前进入第二天的任务。有没有办法让它等待DAG的其余部分完成,然后再进入第二天的DAG周期

(我确实将dependens_on_past视为true,但在这种情况下不起作用)

我的DAG看起来像这样:

               O
               l
               V
O -> O -> O -> O -> O
dag = DAG(dag_id='TEST_DAG', default_args=default_args, schedule_interval=timedelta(minutes=30))

PREVIOUS = ExternalTaskSensor(
    task_id='Previous_Run',
    external_dag_id='TEST_DAG',
    external_task_id='All_Tasks_Completed',
    allowed_states=['success'],
    execution_delta=timedelta(minutes=30),
    dag=DAG
)

T1 = BashOperator(
    task_id='TASK_01',
    bash_command='echo "Hello World from Task 1"',
    dag=dag
)

COMPLETE = DummyOperator(
    task_id='All_Tasks_Completed',
    dag=DAG
)

PREVIOUS >> T1 >> COMPLETE
另外,dag的树状图]


如果希望一次只运行一个实例,请尝试设置
max_active_runs=1

回答这个问题可能有点晚,但我遇到了同样的问题,我解决这个问题的方法是在每个dag中添加两个额外的任务。开始时为“上一步”,结束时为“完成”。“上一个任务”是监视上一个作业的外部任务传感器。Complete只是一个虚拟操作符。假设它每30分钟运行一次,因此dag将如下所示:

               O
               l
               V
O -> O -> O -> O -> O
dag = DAG(dag_id='TEST_DAG', default_args=default_args, schedule_interval=timedelta(minutes=30))

PREVIOUS = ExternalTaskSensor(
    task_id='Previous_Run',
    external_dag_id='TEST_DAG',
    external_task_id='All_Tasks_Completed',
    allowed_states=['success'],
    execution_delta=timedelta(minutes=30),
    dag=DAG
)

T1 = BashOperator(
    task_id='TASK_01',
    bash_command='echo "Hello World from Task 1"',
    dag=dag
)

COMPLETE = DummyOperator(
    task_id='All_Tasks_Completed',
    dag=DAG
)

PREVIOUS >> T1 >> COMPLETE

因此,下一个dag即使进入队列,也不会让任务运行,直到上一个任务完成。

最终对我有效的是

  • 添加任务依赖项:wait_for_down=True,dependens_on_pass=True
  • 创建dag时,将最大活动跑步:1添加到。我确实尝试添加max_active_runs作为默认参数,但没有成功

  • 您可以实现相同的目标,而无需执行任何其他任务。诀窍是
    添加从第一个任务到最后一个任务的依赖项,并为第一个任务设置wait_for_down=True

    在这种情况下,下一次运行的第一个任务将等待当前运行的最后一个任务完成。因此,未来的竞选将被搁置。然后,您可以将
    max\u active\u runs=1
    设置为限制此类保留计划

    这里给出了一个详细的例子

    看看依赖关系

    
    with DAG('dag_past_run_sense',
             schedule_interval='*/2 * * * *',
             default_args=default_args,
             max_active_runs=1) as dag:
    
        read_incr_data = BashOperator(
            task_id='read_incr_data',
            wait_for_downstream=True,
            bash_command='date'
        )
    
        prepare_scd2 = BashOperator(
            task_id='prepare_scd2',
            bash_command='date'
        )
    
        load_final_table = PythonOperator(
            task_id="load_final_table",
            python_callable=load_final_table_status
        )
    
        read_incr_data >> prepare_scd2 >> load_final_table
        read_incr_data >> load_final_table
    

    @不,如果我猜的话(我没有投反对票),那是因为那个答案并没有强制执行命令b@nono我同意乔布的观点。换句话说,通过设置max_active_runs=1,无法保证前一个DAG实例成功完成。事实上,我遇到了一些问题,以防对其他人有所帮助-1)确保您没有使用单线程的
    SequentialExecutor
    (默认值)。这将导致第二个传感器在第一个实际作业之前运行,并且任务处于排队状态时将处于死锁状态。2) 您可能希望在开始处添加
    latestonloyoperator
    ,以跳过回填3)如果这样做,您需要更新
    允许的状态
    ,以包括
    “跳过的”
    状态,4)如果不这样做,则需要手动标记第一个任务成功以摆脱初始死锁状态。您可以设置
    wait\u for\u down=True
    “当设置为true时,task X实例将等待task X上一个实例下游的任务成功完成后再运行。如果任务X的不同实例改变了相同的资源,并且该资源由任务X的下游任务使用,则此功能非常有用。请注意,无论在何处使用wait_for_down,depend_on_pass都将强制为True。“这在airflow 1.9中起作用。另一个注释:我必须手动标记“上一次运行”的第一个实例“任务是成功的。如果没有,它将永远等待以前不存在的执行时间。您可以使用sequentialExecutor,只需将max_active_runs=1放在DAG中。从功能上讲,这与@Oleg Yamin下面描述的
    ExternalTaskSensor
    方法有什么不同或更好的地方吗?