Python 从今天开始,即2019-12-18,安排气流中的DAG每5分钟运行一次

Python 从今天开始,即2019-12-18,安排气流中的DAG每5分钟运行一次,python,airflow,directed-acyclic-graphs,airflow-scheduler,Python,Airflow,Directed Acyclic Graphs,Airflow Scheduler,从今天(2019-12-18)开始,我尝试每5分钟运行一次DAG。我将我的开始日期定义为start\u date:dt.datetime(2019,12,18,10,00,00),计划间隔定义为schedule\u interval='*/5****'。启动气流调度器时,我看不到任何任务正在运行 但是,当我将开始日期修改为开始日期:dt.datetime(2019、12、17、10、00、00)即昨天的日期时,DAG会像每10秒而不是每5分钟一样连续运行 我认为解决这个问题的方法是正确设置开始日

从今天(2019-12-18)开始,我尝试每5分钟运行一次DAG。我将我的开始日期定义为
start\u date:dt.datetime(2019,12,18,10,00,00)
,计划间隔定义为
schedule\u interval='*/5****'
。启动
气流调度器时,我看不到任何任务正在运行

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

我认为解决这个问题的方法是正确设置
开始日期
,但我找不到完美的解决方案。请帮帮我

这是我的密码

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

您传递给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
这些文档()非常有用,它们提供了如何处理数据流中的日期时间的技巧

至于你关于跑步频率的另一个问题。。。默认情况下,DAG跑步的目的是在开始日期和结束日期之间的所有时间间隔上进行“追赶”。要禁用此行为,需要在实例化DAG时添加catchup=False

回填和收集

带有开始日期、结束日期和结束日期的气流DAG schedule\u interval定义了一系列由调度器执行的间隔 转换为单个Dag运行并执行。气流的关键性能 这些DAG运行是原子的、幂等项,并且 默认情况下,调度程序将检查DAG的生存期(从 从开始到结束/现在,每次间隔一次)并开始DAG跑步 未运行(或已清除)的任何间隔。这个概念 这叫追赶

如果您的DAG是为处理自己的捕获而编写的(即不限于 间隔,但改为“现在”,例如。),然后您将需要 关闭catchup(使用DAG.catchup在DAG本身上= False)或默认情况下在配置文件级别使用 默认情况下,catchup\u=False。这样做的目的是指导 调度器仅为的最新实例创建DAG运行 DAG区间序列


我建议浏览我链接的两页,以更好地了解基本气流概念。

您传递给气流的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
这些文档()非常有用,它们提供了如何处理数据流中的日期时间的技巧

至于你关于跑步频率的另一个问题。。。默认情况下,DAG跑步的目的是在开始日期和结束日期之间的所有时间间隔上进行“追赶”。要禁用此行为,需要在实例化DAG时添加catchup=False

回填和收集

带有开始日期、结束日期和结束日期的气流DAG schedule\u interval定义了一系列由调度器执行的间隔 转换为单个Dag运行并执行。气流的关键性能 这些DAG运行是原子的、幂等项,并且 默认情况下,调度程序将检查DAG的生存期(从 从开始到结束/现在,每次间隔一次)并开始DAG跑步 未运行(或已清除)的任何间隔。这个概念 这叫追赶

如果您的DAG是为处理自己的捕获而编写的(即不限于 间隔,但改为“现在”,例如。),然后您将需要 关闭catchup(使用DAG.catchup在DAG本身上= False)或默认情况下在配置文件级别使用 默认情况下,catchup\u=False。这样做的目的是指导 调度器仅为的最新实例创建DAG运行 DAG区间序列

我建议浏览我链接的两页,以更好地了解基本气流概念