Airflow 首次打开时,“气流”将启动两次DAG运行

Airflow 首次打开时,“气流”将启动两次DAG运行,airflow,Airflow,当我在10月25日17:23左右首次启动Airflow Web服务器和计划程序,并打开DAG时,我可以看到它开始了10月23日和10月24日的两次运行: RUN 1 -> 10-23T17:23 RUN 2 -> 10-24T17:23 以下是我的DAG配置: default_args = { 'owner': 'airflow', 'depends_on_past': False, 'start_date': '2019-01-01', 'retr

当我在10月25日17:23左右首次启动Airflow Web服务器和计划程序,并打开DAG时,我可以看到它开始了10月23日和10月24日的两次运行:

RUN 1 -> 10-23T17:23
RUN 2 -> 10-24T17:23
以下是我的DAG配置:

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': '2019-01-01',
    'retries': 0,
}
dag = DAG(
    'my_script',
    default_args=default_args,
    schedule_interval=datetime.timedelta(days=1),
    catchup=False,
)
由于它超过了
开始日期+计划间隔
,并且我已经设置了
catchup=False
,我希望它立即启动一次DAG运行,但我不希望它运行两次

  • 为什么要执行两次DAG运行
  • 我如何防止这种行为

    • 我不确定,但这是我最好的猜测-

      简言之,可能是气流是如何形成的,解决方法是将您的
      开始日期修改为昨天

      TL;博士

      我同意当你开机的时候,启动1个dag,持续10-24小时听起来更自然

      但是,根据您的dag运行,运行1是10-23。 这对我来说意味着初始化第一次运行是不正确的,我已经查看了调度程序代码

      我对这条线有点怀疑

      它位于创建dag运行并设置运行开始日期的函数内

      # The logic is that we move start_date up until
      # one period before, so that timezone.utcnow() is AFTER
      # the period end, and the job can be created...
      now = timezone.utcnow()
      
      # This returns current time + schedule_interval. In your example, this will be tomorrow.
      next_start = dag.following_schedule(now)
      
      # This returns current time - schedule_interval. In your example, this will be yesterday.
      last_start = dag.previous_schedule(now)
      
      # tomorrow <= today should return False 
      if next_start <= now:
          new_start = last_start
      else:
          # and this will return last_start - schedule_interval which means 2 days ago.  
          # wondering if this is intended to be dag.previous_schedule(next_start)???
          new_start = dag.previous_schedule(last_start) 
      
      #逻辑是我们将开始日期提前到
      #前一个时段,因此timezone.utcnow()在后一个时段
      #周期结束,可以创建作业。。。
      now=timezone.utcnow()
      #返回当前时间+计划间隔。在你的例子中,这将是明天。
      下一个\u开始=dag。下一个\u计划(现在)
      #这将返回当前的时间计划间隔。在你的例子中,这将是昨天。
      上一次开始=上一次计划(现在)
      
      #明天你是对的,如果我用昨天(我的例子是2019-10-24)作为开始日期,那么只有一个DAG被执行!如果你认为这是值得提出的气流,请放心。不想窃取你的发现;)+1、好的。我也面临着同样的问题,我想了解为什么它返回2个周期而不是一个(最新!)执行时间返回我遇到了同样的问题,重新启用暂停的DAG(catchup=False),实际上创建了2个DAG运行,而不是1@EmmaAlexG,我们可以向气流团队报告和/或提交PR吗?