从今天开始,即从2019年12月18日开始,安排DAG气流每5分钟运行一次

时间:2019-12-18 11:30:41

标签: python airflow directed-acyclic-graphs airflow-scheduler

从今天开始(2019-12-18),我尝试每5分钟运行一次DAG。我将开始日期定义为start_date:dt.datetime(2019, 12, 18, 10, 00, 00)并将计划间隔定义为schedule_interval= '*/5 * * * *'。启动airflow scheduler时,我看不到任何任务在运行。

但是当我将start_date修改为start_date:dt.datetime(2019, 12, 17, 10, 00, 00)时,即昨天的日期,DAG会像每10秒而不是5分钟一样连续运行。

我认为解决此问题的方法是正确设置start_date,但是我找不到完美的解决方案。请帮帮我!

这是我的代码。

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
import datetime as dt
from airflow.operators.python_operator import PythonOperator

def print_world():
   print('world')


default_args = {
    'owner': 'bhanuprakash',
    'depends_on_past': False,
    'start_date': dt.datetime(2019, 12, 18, 10, 00, 00),
    'email': ['bhanuprakash.uchula@techwave.net'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': dt.timedelta(minutes=5)
}

with DAG('dag_today',
    default_args=default_args,
    schedule_interval= '*/5 * * * *'
    ) as dag:


    print_hello = BashOperator(task_id='print_hello',
        bash_command='gnome-terminal')


    sleep = BashOperator(task_id='sleep',
        bash_command='sleep 5')


    print_world = PythonOperator(task_id='print_world',
        python_callable=print_world)

print_hello >> sleep >> print_world

1 个答案:

答案 0 :(得分:0)

您要传递给Airflow的datetime对象不支持时区。气流内部使用UTC。您传递给Airflow的朴素的datetime对象可能与计划程序的时间概念不符,这可能就是为什么DAG没有计划在“今天”午夜运行(2019-12-18)的原因。

而不是像这样传递朴素的datetime对象:

'start_date': dt.datetime(2019, 12, 18, 10, 00, 00)

尝试使用钟摆使您的DAG时区更清晰:

import pendulum

...
'start_date': pendulum.datetime(year=2019, month=12, day=10).astimezone('YOUR TIMEZONE'), # See list of tz database time zones here -> https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

文档(https://airflow.apache.org/docs/stable/timezone.html)非常有用,获得了有关如何在Airflow中处理日期时间的提示。

关于运行频率的其他问题...默认情况下,DAG运行设计为在开始日期和结束日期之间的所有时间间隔进行“赶超”。要禁用此行为,您将需要在实例化DAG时添加catchup = False。

Airflow docs

  

回填和追赶

     

一个带有开始日期(可能是结束日期)和   schedule_interval定义了调度程序的一系列间隔   变成单独的Dag Run并执行。气流的关键功能   这些DAG运行是原子的,幂等的项,并且   默认情况下,调度程序将检查DAG的生命周期(从   开始/现在,一次间隔一次),然后开始DAG Run   任何尚未运行(或已清除)的间隔。这个概念   称为赶上。

     

如果您编写的DAG可以处理自己的追赶(IE不限于   时间间隔,但例如改为“现在”。)   关闭追赶(使用dag.catchup =在DAG本身上   False)或默认情况下在配置文件级别使用   catchup_by_default = False。这将指导   调度程序,仅为的最新实例创建DAG运行   DAG间隔系列。

我建议仔细阅读我链接的两个页面,以更好地了解基本的气流概念。