我想尝试使用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离型注释
答案 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_interval
和bash_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 * * *'
如果其中任何一项满足您的要求,那就简单地'schedule_interval':'@hourly'
最后,您还可以将时间表用作python timedelta对象,例如下午12点
'schedule_interval': timedelta(hours=12)