我正在尝试从DAG中的父任务执行5分钟后执行任务。
DAG:任务1 ---->等待5分钟---->任务2
如何在Apache Airflow中实现这一目标?预先感谢。
答案 0 :(得分:2)
您可以添加一个TimeDeltaSensor
,其时间间隔为Task1
和Task2
之间的5分钟。
答案 1 :(得分:1)
可以通过引入一项在您的Task 1
和Task 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 1
或Task 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