如何正确工作气流schedule_interval

时间:2016-03-30 02:46:38

标签: airflow

我想尝试使用Airflow而不是Cron。 但是schedule_interval并没有像我预期的那样工作。

我写了如下的python代码 根据我的理解,Airflow应该继续运行" 2016/03/30 8:15:00"但那时它并没有奏效。

如果我像这样改变了#34;' schedule_interval':timedelta(分钟= 5)",我认为它正常工作。

" notice_slack.sh"只是把slack api称为我的频道。

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29, 8, 15),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="@daily",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = '/tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

我想在每天的特定时间运行我的一些脚本,就像这个cron设置一样。

15 08 * * * bash /tmp/notice_slack.sh

我已阅读文件Scheduling & Triggers,我知道它有点不同。 所以我试着安排在" start_date"和" schedule_interval"设置。

有谁知道我该怎么做?

  

气流版

     

INFO - 使用执行程序LocalExecutor

     

v1.7.0

     

亚马逊-Linux的AMI / 2015.09离型注释

5 个答案:

答案 0 :(得分:9)

当2016/03/30 8:15:00 +计划间隔(每日)通过时,气流将启动您的DAG。所以你的DAG将在2016/03/31 8:15:00运行。

您可以查看Airflow FAQ

答案 1 :(得分:8)

试试这个:

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 3, 29),
}

dag = DAG(
    dag_id='notice_slack',
    default_args=args,
    schedule_interval="15 08 * * *",
    dagrun_timeout=timedelta(minutes=1))

# cmd file name
CMD = 'bash /tmp/notice_slack.sh'

run_this = BashOperator(
    task_id='run_transport', bash_command=CMD, dag=dag)

start_date(datetime) - 任务的start_date确定第一个任务实例的execution_date。最佳做法是将start_date四舍五入到DAG的schedule_interval。

schedule_interval(datetime.timedelta或dateutil.relativedelta.relativedelta或作为cron表达式的str) - 定义DAG运行的频率,此timedelta对象被添加到最新任务实例的execution_date中以找出下一个时间表。

只需在您的cron设置中将schedule_intervalbash_command配置为相同即可。

答案 2 :(得分:1)

如果您不确定如何创建气流玉米表达式,可以尝试使用crontab.guru

答案 3 :(得分:0)

对于您给出的示例,@daily将在午夜过后运行您的工作。您可以尝试将其更改为timedelta(days=1),相对于包含08:15的固定start_date。 或者,您可以为schedule_interval='15 08 * * *'使用cron规范,在这种情况下,您希望首次运行的日期之前的当天8:15之前的任何开始日期。

请注意,depends_on_past: False已经是默认设置,您可能已经将其行为与DAG参数中的catchup=false混淆了,这样可以避免在开始日期到现在DAG的时间之间进行过去的运行。计划间隔会运行。

答案 4 :(得分:0)

首先,您的开始日期应该是过去的日期- 代替'start_date': datetime(2016, 3, 29, 8, 15) 您会尝试'start_date': datetime(2016, 2, 29, 8, 15)

并应用'catchup':False来防止回填-除非您要这样做。

来自Airflow文档- 通过start_date + schedule_interval后,Airflow计划程序会立即触发任务。

计划时间间隔可以作为cron提供- 如果要每天在上午8:15运行它,则表达式为-* '15 8 * * '

如果您只想在10月31日上午8:15运行它,则表达式为-* '15 8 31 10 '

要提供此信息,请在您的Dag属性中'schedule_inteval':'15 8 * * *'

您可以从https://crontab.guru/

了解更多信息

或者,有气流预设- enter image description here

如果其中任何一项满足您的要求,那就简单地'schedule_interval':'@hourly'

最后,您还可以将时间表用作python timedelta对象,例如下午12点

'schedule_interval': timedelta(hours=12)