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這么坑呢。