气流DAG触发

时间:2017-07-26 18:18:34

标签: python airflow airflow-scheduler

我们最近尝试采用Airflow作为我们的数据工作流程"引擎,虽然我已经解决了大部分问题,但我仍处于关于调度程序如何计算何时触发DAG的灰色区域。

看看这个简单的dag:

from airflow import DAG
from datetime import datetime
from airflow.operators.bash_operator import BashOperator

dag_options = {                
            'owner':                'Airflow',  
            'depends_on_past':      False,      
            'start_date':           datetime.now()
}

with DAG('test_dag1', schedule_interval="5 * * * *", default_args=dag_options) as dag:
                task1 = BashOperator(      
                task_id='task1', 
                bash_command='date',                
                dag=dag)      

时间表会选择此功能,但不会执行它。现在如果我改变" start_date"到:

datetime(year=xxxx,month=yyyy=day=zzzz) 

其中xxxx,yyyy,zzzz是今天的日期,它将开始执行。原因是调度程序不断地从源dag文件夹重新读取这个dags,每次都执行datetime.now(),注意到开始日期与当前排队的不同,重新添加这个dag因此重新调度/推进执行日期(我的 dag_dir_list_interval 是300)?

此外,在气流中,据我所知,当dag未暂停(或添加dags_are_paused_at_creation = False)时,调度程序将按如下方式安排执行:

  • 第一个dag执行:在(start_date + interval)之后的瞬间
  • 第二次dag执行:after after(start_date +(interval * 2))
  • 第3次dag执行:after after(start_date +(interval * 3))

这是正确的假设吗?

更新(7/30/2017)

基于上述假设,我今天(2017年7月30日)创建了这个dag:

from airflow import DAG
from datetime import datetime
from airflow.operators.bash_operator import BashOperator

dag_options = {                
            'owner':             'Airflow',  
            'depends_on_past':   False,      
            'start_date':   
datetime(year=2017,month=7,day=30,hour=20,minute=10)
}

with DAG('test_dag_100', schedule_interval="*/10 * * * *", 
default_args=dag_options) as dag:
                task1 = BashOperator(      
                task_id='task_100', 
                bash_command='date',                
                dag=dag)      

应该从(UTC)开始:

  • 7/30/2017 20:20:00
  • 7/30/2017 20:30:00
  • 7/30/2017 20:40:00

不幸的是,这种情况并没有发生。 以下是我的仪表板的一些屏幕截图:

有人可以解释为什么在20:21:00 dag没有执行?在20:31:00之后它还没有执行......我在这里缺少什么?

顺便说一句,我也注意到,出于某种原因,每次我去的时候 通过仪表板手动启动一个dag,它只是坐在"运行"阶段。为什么是这样?手动踢它与任何启动计时选项(start_date / interval / etc)有什么关系?

感谢您提供的任何澄清

1 个答案:

答案 0 :(得分:2)

您的假设是正确的。在从开始日期开始经过指定的计划间隔后,Airflow将计划第一次DAG运行。使用datetime.now()作为开始日期将导致Airflow很少(如果有的话)触发DAG。它在调度文档中提到过。

如果您要指定特定的开始日期,例如日期时间(2017,7,27,1,0),并且计划间隔为" 5 * * * *",则为1:在7月27日凌晨05点,DAG将被触发第一次运行。之后每隔五分钟就会继续运行。