Airflow 如何阻止DAG回填?catchup\u默认值=False和catchup=False似乎不起作用,气流调度器无法运行

Airflow 如何阻止DAG回填?catchup\u默认值=False和catchup=False似乎不起作用,气流调度器无法运行,airflow,airflow-scheduler,Airflow,Airflow Scheduler,在afflow.cfg中设置catchup\u by\u default=False似乎不起作用。同样,将catchup=False添加到DAG也不起作用 下面是如何重现这个问题。我总是从头开始,运行db。一旦解除dag的暂停,任务就开始回填 这是dag的设置。我只是在用电脑 要明确的是,如果您在当前时间为2018-10-22T9:00:00.000EDT(即2018-10-22T13:00:00.000Z)时启用了您指定的此DAG,它将在2018-10-22T13:00:00.000Z之后的某

在afflow.cfg中设置catchup\u by\u default=False似乎不起作用。同样,将catchup=False添加到DAG也不起作用

下面是如何重现这个问题。我总是从头开始,运行
db
。一旦解除dag的暂停,任务就开始回填

这是dag的设置。我只是在用电脑


要明确的是,如果您在当前时间为2018-10-22T9:00:00.000EDT(即2018-10-22T13:00:00.000Z)时启用了您指定的此DAG,它将在2018-10-22T13:00:00.000Z之后的某个时间启动,运行日期标记为2018-10-21T00:00:00.000Z

这不是从开始日期开始的回填,而是在没有任何之前的运行的情况下,它会“追上”最近完成的有效期;我不确定为什么气流中会出现这种情况,但这是因为
catchup=False
意味着创建一个最近有效期的单次运行

如果dagrun运行日期令您更加困惑,请记住运行日期是间隔期开始的执行日期。间隔数据仅在间隔期结束时完全可用,但气流设计为在间隔期开始时通过

然后,下一次运行将在2018-10-23T00:00:00.000Z后开始,执行日期设置为2018-10-22T00:00:00.000Z


如果在22日或更晚的时间,您得到的任何运行日期早于21日,或者计划了多次运行,则yes
catchup=False
不起作用。但在v1.10或v1-10-stable分支中没有其他关于这种情况的报告。

如@dlamblin所述,以及在“太气流”中所述,将为最近的有效间隔创建一个DagRun
catchup=False
将指示调度程序仅为DAG间隔系列的最新实例创建DAG运行


虽然在使用
timedelta
作为
schedule\u interval
而不是CRON表达式或CRON预设时,会出现错误。这已在气流主控器中修复。我们将使用此修复程序发布Airflow 1.10.11。

我知道此线程有点旧。但是,在
aiffair.cfg
中设置
catch\u up\u default=False确实为我阻止了
aiffair
。 (我的
气流
版本是1.10.12)

我认为默认情况下此配置未设置为
False
。这和dag在
开始日期之后开始一个
计划间隔
的事实是困扰气流初学者的两个最令人困惑的事情


我第一次使用
气流
,浪费了整整一个下午,试图弄清楚为什么我的测试任务(计划每5分钟运行一次)连续快速运行(比如每5-6秒运行一次)。我花了一段时间才意识到这是
backfill
在起作用。

aiffair.cfg
中设置
catchup\u by\u default=False
后,您是否再次运行
aiffair initdb
?我非常肯定地清除了所有内容,包括删除docker卷,并每次重新初始化db。它仍然不起作用。这就是为什么它令人困惑。我还尝试了顺序执行器和本地执行器,尽管我怀疑这会有什么不同。@kaxil一旦我取消了DAG的暂停,它就会立即被重新填充,即使DAG的catchup=False和catchup\u默认值=False。这很奇怪。您使用的是哪个版本的Airflow?我正在运行1.10.0版。我明白您的意思,并且我理解它如何帮助完全用Airflow编写的ETL流程。我的问题是,我们如何将Airflow作为一个纯粹的调度器来使用,它只在计划出现时运行作业。例如,如果我们有一个作业在上午8:00-UTC运行,如果DAG在当时关闭,在上午8:15-UTC打开,它就不应该运行。目前,即使使用
latestonloperator
我也注意到,如果它在
start\u日期+某个计划期内运行作业
。有没有办法克服这个问题/Airflow_功能?@SuhasHegde认为运行单个最新时段的行为只会发生在一个新的dag上,之前没有运行过,如果在dag运行一次后关闭它,稍后再打开它,它将无法赶上8:15的上午8-8点运行,因为它错过了它。它是一个糟糕的“纯调度程序”;cron更适合这样做。您可以编写cron或jenkins作业来触发通过cli或web api运行的dag,我不确定它是否会运行关闭的dag,我不这么认为。对于外部计划触发器,您应该设置
计划间隔=None
。对于我来说,假设我有一个DAG,开始日期为2018年1月1日,计划每天运行。现在,这是我第一次使用新数据库启动airflow。DAG以前从未运行过。一旦我解除我的DAG暂停,调度程序将从2018年1月1日、2018年1月2日、2018年1月3日开始运行DAG,依此类推。我认为catchup=False是为了阻止这种行为的发生。我的理解错了吗?@Sam你的理解是对的,这种行为似乎是你碰到的某种错误。你能调查一下有关这个问题的详细资料吗?你也可以试着在apache-afflow.slack.com上打开它,它有一些invite flow@VibhorJain是的,我已经在中修复了它,并将在aifflow 1.10.11中发布它
default_args = {
    "owner": "airflow",
    "depends_on_past": False,
    "start_date": datetime(2018, 9, 16),
    "email": ["airflow@airflow.com"],
    "email_on_failure": False,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG("tutorial", default_args=default_args, schedule_interval=timedelta(1), catchup=False)