Apache Airflow:将任务延迟一段时间

时间:2019-03-05 11:52:14

标签: python airflow

我正在尝试从DAG中的父任务执行5分钟后执行任务。

DAG:任务1 ---->等待5分钟---->任务2

如何在Apache Airflow中实现这一目标?预先感谢。

3 个答案:

答案 0 :(得分:2)

您可以添加一个TimeDeltaSensor,其时间间隔为Task1Task2之间的5分钟。

答案 1 :(得分:1)

可以通过引入一项在您的Task 1Task 2之间强制指定时间延迟的任务来实现上述行为


这可以使用PythonOperator

来实现
import time
from airflow.operators.python_operator import PythonOperator

delay_python_task: PythonOperator = PythonOperator(task_id="delay_python_task",
                                                   dag=my_dag,
                                                   python_callable=lambda: time.sleep(300))

task_1 >> delay_python_task >> task_2

或者也使用BashOperator

from airflow.operators.bash_operator import BashOperator
delay_bash_task: BashOperator = BashOperator(task_id="delay_bash_task",
                                             dag=my_dag,
                                             bash_command="sleep 5m")
task_1 >> delay_bash_task >> task_2

注意:给定的代码段未经测试


参考


UPDATE-1

还有其他一些引入延迟的方法

  • on_success_callback / on_failure_callback:根据Task 2是在Task 1成功还是失败的情况下运行,您可以通过以下任意一种方式传递lambda: time.sleep(300) Task 1
  • 的参数
  • pre_execute() / post_execute():在time.sleep(300)的{​​{3}}或Task 1的{​​{3}}中调用Task 2同样的效果。当然,这将涉及为您的tasks(1或2)修改代码,因此最好避免使用它

我个人希望使用额外的task方法,因为它可以使事情更明确,并且不会错误地夸大Task 1Task 2的运行时间< / p>

答案 2 :(得分:0)

@ y2k-shubham是迄今为止最好的答案,但是,我要警告不要使用回调解决方案。因为它首先将任务标记为成功,然后执行回调。这意味着task2将不会看到任何延迟。如果您不想使用单独的任务,则可以使用以下内容:

< ... >
task1 = DummyOperator(task_id='task1', dag=dag)
task1.post_execute = lambda **x: time.sleep(300)
task2 = DummyOperator(task_id'task2', dag=dag)

task1 >> task2