Airflow有很多类型的"startdate",比如说dag本身定义时候的start_date,dag每隔一段时间执行的时候的execution_date,以及我们直观感受到的这个dag真正开始执行的时间,不同类型的startdate让人烟花缭乱,那么它们的区别是什么呢?
对于dag本身定义的start_date,它定义了这个dag开始的时间,如果dag本身同时定义了有周期性的schedule interval,那么dag会从startdate开始,每隔一个schedule interval建立一次DagRun,直到当前时间为止。
很多人可能会认为dag在startdate的时候就开始执行相关任务了,但实际并不是,对于scheduled run而言,它的第一次run是在startdate + scheduled interval之后的,即这个dag需要过完第一次interval之后才会触发第一次运行。原因的话在下文会讨论。(相对于start_date而言dag定义的时候还有一个可选变量end_date,不过如果设置end_date的话当到了这个时间dag就不再进行新的run了,和startdate需要等一个interval还是有区别的)
对于execution date而言,需要分两种情况。第一种是scheduled run,那么它的定义类似于startdate,即并不是实际执行这个任务的时间,而是执行该任务的时间减去一个interval。另外一种情况是手动触发dag run,那么这个时候execution date即触发该dag run时间。
举个栗子,一个dag的scheduled interval为一天,我们规定这个dag在每天早上5点运行。对于今天(2021年7月27日)运行的dagrun,如果它是按照scheduled调度在早上5点运行的话,它的execution date为7月26日的5点;而如果我们在早上9点手动触发该dag的话,此时的execution date即为27日早上9点。
有意思的是,为什么scheduled dag的execution date会比实际运行的时间早一个时间间隔interval呢?
Airflow有个很常见的应用场景是每日的(离线)数据批量处理,一般来说对于某一天的数据处理是要等到这一天过完才能进行(如果还没过完该天进行处理则数据是不全的)。对于scheduled dag而言,因为它是按照时间表来跑的,这里的execution_date(包括之前提到的定义DAG情况下的start_date)其实可以理解为收集的是哪一天(或哪一个时间间隔interval)的数据,所以说实际的执行时间是要晚于execution_date一个时间间隔的,只有过完这个时间间隔,才会有对应的数据可以进行处理。
综上所述,start_date,execution_date和实际开始运行的时间关系如下:
对于scheduled dag:
execution_date比实际开始运行的时间早一个scheduled interval,startdate可以理解为这个dag第一次运行时候的execution_date
对于手动触发的dag:
execution_date就是dag实际被触发的时间,所见即所得,没有太多的条条框框