从今天开始(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
答案 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。
回填和追赶
一个带有开始日期(可能是结束日期)和 schedule_interval定义了调度程序的一系列间隔 变成单独的Dag Run并执行。气流的关键功能 这些DAG运行是原子的,幂等的项,并且 默认情况下,调度程序将检查DAG的生命周期(从 开始/现在,一次间隔一次),然后开始DAG Run 任何尚未运行(或已清除)的间隔。这个概念 称为赶上。
如果您编写的DAG可以处理自己的追赶(IE不限于 时间间隔,但例如改为“现在”。) 关闭追赶(使用dag.catchup =在DAG本身上 False)或默认情况下在配置文件级别使用 catchup_by_default = False。这将指导 调度程序,仅为的最新实例创建DAG运行 DAG间隔系列。
我建议仔细阅读我链接的两个页面,以更好地了解基本的气流概念。