Airflow 如何使用工作流计划任务

Airflow 如何使用工作流计划任务,airflow,airflow-scheduler,Airflow,Airflow Scheduler,不幸的是,即使阅读了这里的许多问题和airflow网站的FAQ页面,我仍然不明白airflow是如何安排任务的。我这里有一个非常简单的示例任务: from airflow import DAG from airflow.operators.bash_operator import BashOperator from datetime import datetime, timedelta default_args = { "depends_on_past": False, "st

不幸的是,即使阅读了这里的许多问题和airflow网站的FAQ页面,我仍然不明白airflow是如何安排任务的。我这里有一个非常简单的示例任务:

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

我的naiv观点是该任务将在5月29日08:30运行。但随着时间的推移,气流并没有安排这项任务。如果我将cron表达式更改为“*8***”,它将每分钟安排一个任务

然而,当我使用相同的DAG,开始日期是昨天(在这种情况下是5月28日),任务将安排在08:30,但它的执行日期是28日(即使它在5月29日运行),web ui中的开始日期是5月29日。这很令人困惑


最后我想从airflow得到的很简单:“这是python代码,在这个时间段运行它”。那么我怎样才能做到这一点呢。再说一次,我想从明天开始,每天08:30安排一项任务。

答案可以在以下内容中找到:

请注意,如果您以一天的时间间隔运行DAG,则在2016-01-01T23:59之后不久将触发标有2016-01-01的运行。换句话说,一旦作业实例所覆盖的时间段结束,它就会启动

让我们重复一下,计划程序在开始日期之后的一个计划时间间隔内,在周期结束时运行作业。

因此,根据您的情况,如果您将开始日期设置为5月29日,使用原始cron,它将从明天5月30日开始每天08:30运行


无论如何,如果您在一天中的某个时间点不需要dag,您可以将计划间隔设置为“@daily”,它将在每天的开始(00:00)触发。如果@daily中有很多DAG,不用担心,调度器和工作人员将知道如何处理这些DAG以执行所有DAG。如果您有依赖于其他DAG的DAG,则有一些机制可以连接它们,这样您就不必担心指定小时。

实际上,您将等待整个计划间隔(1天)完成,然后开始执行

因此,如果您希望今天执行任务,则应以计划间隔完成的方式设置开始时间。因此,将开始时间设置为:
datetime(2020,5,28)


如果计划间隔为1周,那么任务将在开始时间后1周启动,依此类推……

感谢您的回复。我想我不得不接受这一事实,但在我看来这毫无意义,而且当你每天都想执行一项任务时,这也让你很难绞尽脑汁(因为你每次都会看到一天的延迟)