不幸的是,即使在阅读了这里的许多问题以及气流网站的FAQ页面后,我仍然不了解气流如何安排任务。我在这里有一个非常简单的示例任务:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
default_args = {
"depends_on_past": False,
"start_date": datetime(2020, 5, 29),
"email_on_failure": False,
"email_on_retry": False,
"retries": 1,
"retry_delay": timedelta(minutes=5),
}
dag = DAG(
"example_dag_one",
schedule_interval="30 8 * * *",
catchup=False,
default_args=default_args,
)
with dag:
t1 = BashOperator(task_id="print_hello", bash_command="echo hello", dag=dag)
t1
我的观点是,此任务将在5月29日08:30运行。但是随着时间的流逝,气流并未安排该任务。如果我将cron表达式更改为“ * 8 * * *”,它将每分钟安排一次任务。
但是,当我使用相同的DAG且开始日期为昨天(在这种情况下为5月28日)时,任务将排定为08:30,但执行日期为28(即使它在5月29日运行)网络用户界面的开始日期是5月29日。这非常令人困惑。
最后我要从气流中得到的内容很简单:“这是python代码,请在这个时候运行它”。所以我怎么能做到这一点。再说一次,我想安排从明天开始的每天08:30进行任务。
答案 0 :(得分:2)
答案可以在Airflow official documentation中找到:
请注意,如果您以一天的schedule_interval运行DAG,则在2016-01-01T23:59之后不久将触发标记为2016-01-01的运行。换句话说,作业实例所涵盖的时间段结束后便开始启动。
让我们重复一下计划程序会在开始日期之后的那个周期结束后的一个schedule_interval内运行您的工作。
因此,根据您的情况,如果您将开始日期定为5月29日,并且带有原始cron,它将从5月30日明天开始每天在08:30运行。
无论如何,如果您在一天中的某个特定时间不需要特别的限制,则可以将计划间隔设置为“ @daily”,它将在每天的开始(00:00)触发。如果@daily有很多问题,请不要担心,调度程序和工作人员将知道如何处理它以执行所有命令。如果您有依赖于其他dag的dag,则可以使用一些机制将它们串联起来,这样您就不必担心指定小时数了。
答案 1 :(得分:0)
实际上,Airflow将等待整个调度间隔(1天)完成,然后开始执行!
因此,如果您希望今天2020/ 5/ 29
执行任务,则应以调度间隔结束的方式设置开始时间。因此,将开始时间设置为:datetime(2020, 5, 28)
如果计划间隔为1周,那么任务将在开始时间的1周后启动,依此类推...