代码:
Python版本2.7.x和气流版本1.5.1
我的dag脚本就是这个
from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'xyz',
'depends_on_past': False,
'start_date': datetime(2015,10,13),
'email': ['xyz@email.in'],
'schedule_interval':timedelta(minutes=5),
'email_on_failure': True,
'email_on_retry': True,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG('testing', default_args=default_args)
run_this_first = BashOperator(task_id='Start1',bash_command='date', dag=dag)
for i in range(5):
t = BashOperator(task_id="Orders1"+str(i), bash_command='sleep 5',dag=dag)
t.set_upstream(run_this_first)
从那你可以看出我正在创建一个包含6个任务的DAG,第一个任务(Start1)首先启动,之后所有其他五个任务开始
目前我在DAG开始之间的时间延迟了5分钟
第一种类型的所有六项任务都完美运行,但五分钟后DAG未重新启动
已经超过1小时DAG没有重新启动我真的不知道我错了。
如果有人可以指出我出了什么问题,那将是非常好的。我尝试使用airflow testing clear
进行清算然后发生同样的事情。它运行第一个实例然后就站在那里。
命令行显示的唯一内容是Getting all instance for DAG testing
当我更改schedule_interval的位置时,它只运行任何调度间隔parallel.That在5分钟内完成300或更多任务实例。没有5分钟的计划间隔
代码2:
from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'xyz',
'depends_on_past': False,
'start_date': datetime(2015,10,13),
'email': ['xyz@email.in'],
'email_on_failure': True,
'email_on_retry': True,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG('testing',schedule_interval=timedelta(minutes=5),default_args=default_args)#Schedule here
run_this_first = BashOperator(task_id='Start1',bash_command='date', dag=dag)
for i in range(5):
t = BashOperator(task_id="Orders1"+str(i), bash_command='sleep 5',dag=dag)
t.set_upstream(run_this_first)
答案 0 :(得分:7)
对于Code 2,我猜其每分钟运行的原因是:
开始时间为2015-10-13 00:00
计划间隔为5分钟
调度程序的每次心跳(默认为5秒),都会检查您的DAG
解决方案是将DAG start_date设置为datetime.now() - schedule_interval
。
如果你想调试:
在settings.py中将LOGGINGLEVEL设置为debug
将is_queueable()
的类方法airflow.models.TaskInstance
修改为
def is_queueable(self, flag_upstream_failed=False):
logging.debug('Checking whether task instance is queueable or not!')
if self.execution_date > datetime.now() - self.task.schedule_interval:
logging.debug('Too early to execute: execution_date {0} + task.schedule_interval {1} > datetime.now() {2}'.format(self.execution_date, self.task.schedule_interval, datetime.now()))
return False
...
答案 1 :(得分:3)
因为开始时间(2015-10-13 00:00)比现在时间短,所以它会触发气流backfill。当气流调度程序检测到每秒(其开始日期)时,它将在2015-10-13 00:00运行,但执行日期在5分钟(任务间隔时间)之间。
请参阅日志名称:
$tree airflow/logs/testing/
testing/
|-- Orders10
| |-- 2015-10-13T00:00:00
| |-- 2015-10-13T00:05:00
| -- 2015-10-13T00:10:00
|-- Orders11
| |-- 2015-10-13T00:00:00
| |-- 2015-10-13T00:05:00
| -- 2015-10-13T00:10:00
|-- Orders12
| |-- 2015-10-13T00:00:00
| |-- 2015-10-13T00:05:00
| -- 2015-10-13T00:10:00
|-- Orders13
| |-- 2015-10-13T00:00:00
| |-- 2015-10-13T00:05:00
| -- 2015-10-13T00:10:00
|-- Orders14
| |-- 2015-10-13T00:00:00
| |-- 2015-10-13T00:05:00
| -- 2015-10-13T00:10:00
-- Start1
|-- 2015-10-13T00:00:00
|-- 2015-10-13T00:05:00
|-- 2015-10-13T00:10:00
-- 2015-10-13T00:15:00
请参阅日志的创建时间:
$ll airflow/logs/testing/Start1
-rw-rw-r-- 1 admin admin 4192 Nov 9 14:50 2015-10-13T00:00:00
-rw-rw-r-- 1 admin admin 4192 Nov 9 14:50 2015-10-13T00:05:00
-rw-rw-r-- 1 admin admin 4192 Nov 9 14:51 2015-10-13T00:10:00
-rw-rw-r-- 1 admin admin 4192 Nov 9 14:52 2015-10-13T00:15:00
此外,您可以在Web UI上看到任务实例: