Airflow Scheduler调度的坑:
官网上关于调度是这么说的
Note that if you run a DAG on a schedule_interval of one day, the run stamped 2016-01-01 will be trigger soon after 2016-01-01T23:59. In other words, the job instance is started once the period it covers has ended.
看第一遍可能以为Airflow的调度是往后延一个周期的,比如一个每日执行的任务,会在1月2日0点执行1月1日的任务。而实际上,并非如此。
Airflow什么时候开始执行任务?实际上是从dag的start_date + schedule_interval开始的,如果schedule_interval设成@daily,那么会从start_date之后的一天开始。
这个实际上在他的FAQ里面提到了:
Is your start_date set properly? The Airflow scheduler triggers the task soon after the start_date + scheduler_interval is passed.
注意我理解这里的start_date并非dag参数里面的start_date,比如今天是8月1日,参数的start_date设成了7月1日,那么Airflow会首先去补7月1日-7月31日的数据,补完以后,拿来计算最新的dag run的日期就变成了8月1日,其实这里面的start_date是指最近的执行日期,如果是8月1日,首次任务会在8月2日00:00:00后执行。
但是如果schedule_interval设成cron表达式会怎样?可能我们会设成每天的15:00:00启动dag,但是当天的15:00:00是不会启动的,即使过了15:00:00到了16:00:00也不会去backfill这个dag。
因为Airflow会把这个cron表达式解释为shedule_interval为1天,所以会在第二天才启动。其实跟设置成@daily的效果一样的。但是具体是从00:00:00启动还是从15:00:00启动这个尚待考证。
那么如果想当天就启动一个dag应该怎么做?答案就是把schedule_interval设短一点。如果还想用cron,那么就设置成*/15 15 * * *这样的形式。dag会在15:00-16:00间每隔15分钟跑一次,程序逻辑里面就多判重一下,没办法,谁叫Airflow这么坑呢。