Airflow有很多類型的"startdate",比如說dag本身定義時候的start_date,dag每隔一段時間執(zhí)行的時候的execution_date,以及我們直觀感受到的這個dag真正開始執(zhí)行的時間,不同類型的startdate讓人煙花繚亂,那么它們的區(qū)別是什么呢?
對于dag本身定義的start_date,它定義了這個dag開始的時間,如果dag本身同時定義了有周期性的schedule interval,那么dag會從startdate開始,每隔一個schedule interval建立一次DagRun,直到當(dāng)前時間為止。
很多人可能會認(rèn)為dag在startdate的時候就開始執(zhí)行相關(guān)任務(wù)了,但實(shí)際并不是,對于scheduled run而言,它的第一次run是在startdate + scheduled interval之后的,即這個dag需要過完第一次interval之后才會觸發(fā)第一次運(yùn)行。原因的話在下文會討論。(相對于start_date而言dag定義的時候還有一個可選變量end_date,不過如果設(shè)置end_date的話當(dāng)?shù)搅诉@個時間dag就不再進(jìn)行新的run了,和startdate需要等一個interval還是有區(qū)別的)
對于execution date而言,需要分兩種情況。第一種是scheduled run,那么它的定義類似于startdate,即并不是實(shí)際執(zhí)行這個任務(wù)的時間,而是執(zhí)行該任務(wù)的時間減去一個interval。另外一種情況是手動觸發(fā)dag run,那么這個時候execution date即觸發(fā)該dag run時間。
舉個栗子,一個dag的scheduled interval為一天,我們規(guī)定這個dag在每天早上5點(diǎn)運(yùn)行。對于今天(2021年7月27日)運(yùn)行的dagrun,如果它是按照scheduled調(diào)度在早上5點(diǎn)運(yùn)行的話,它的execution date為7月26日的5點(diǎn);而如果我們在早上9點(diǎn)手動觸發(fā)該dag的話,此時的execution date即為27日早上9點(diǎn)。
有意思的是,為什么scheduled dag的execution date會比實(shí)際運(yùn)行的時間早一個時間間隔interval呢?
Airflow有個很常見的應(yīng)用場景是每日的(離線)數(shù)據(jù)批量處理,一般來說對于某一天的數(shù)據(jù)處理是要等到這一天過完才能進(jìn)行(如果還沒過完該天進(jìn)行處理則數(shù)據(jù)是不全的)。對于scheduled dag而言,因?yàn)樗前凑諘r間表來跑的,這里的execution_date(包括之前提到的定義DAG情況下的start_date)其實(shí)可以理解為收集的是哪一天(或哪一個時間間隔interval)的數(shù)據(jù),所以說實(shí)際的執(zhí)行時間是要晚于execution_date一個時間間隔的,只有過完這個時間間隔,才會有對應(yīng)的數(shù)據(jù)可以進(jìn)行處理。
綜上所述,start_date,execution_date和實(shí)際開始運(yùn)行的時間關(guān)系如下:
對于scheduled dag:
execution_date比實(shí)際開始運(yùn)行的時間早一個scheduled interval,startdate可以理解為這個dag第一次運(yùn)行時候的execution_date
對于手動觸發(fā)的dag:
execution_date就是dag實(shí)際被觸發(fā)的時間,所見即所得,沒有太多的條條框框