Apache Airflow 调度程序不会在调度时间触发 DAG

新手上路,请多包涵

当我安排 DAG 在每天的特定时间运行时,DAG 执行根本不会发生。但是,当我重新启动 Airflow 网络服务器和调度程序时,DAG 在该特定日期的预定时间执行一次,并且不会从第二天开始执行。我将 Airflow 版本 v1.7.1.3 与 python 2.7.6 一起使用。下面是 DAG 代码:

 from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

import time
n=time.strftime("%Y,%m,%d")
v=datetime.strptime(n,"%Y,%m,%d")
default_args = {
    'owner': 'airflow',
    'depends_on_past': True,
    'start_date': v,
    'email': ['airflow@airflow.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=10),

}

dag = DAG('dag_user_answer_attempts', default_args=default_args, schedule_interval='03 02 * * *')

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
    task_id='user_answer_attempts',
    bash_command='python /home/ubuntu/bigcrons/appengine-flask-skeleton-master/useranswerattemptsgen.py',
    dag=dag)

难道我做错了什么?

原文由 Prabhjot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
1 个回答

您的问题是 start_date 被设置为当前时间。 Airflow 在间隔 结束 时运行作业,而不是开始。这意味着您的作业的第一次运行将在第一个间隔之后。

例子:

你制作了一个 dag,并在午夜将其放在 Airflow 中。今天 (20XX-01-01 00:00:00) 也是开始日期,但它是硬编码的 ( "start_date":datetime(20XX,1,1) )。计划间隔是每天,就像你的 ( 3 2 * * * )。

该 dag 第一次排队等待执行的时间是 20XX-01-02 02:03:00,因为那是间隔时间 结束 的时间。如果您查看当时正在运行的 dag,它的开始日期时间应该在 schedule_date 之后大约一天。

您可以通过将 start_date 硬编码为日期 确保动态日期比执行之间的间隔更晚(在您的情况下,2 天就足够了)来解决此问题。 Airflow 建议您使用静态开始日期,以防您需要重新运行作业或回填(或结束 dag)。

有关回填的更多信息(这个常见的 stackoverflow 问题的反面),请查看文档或这个问题: Airflow not scheduling Correctly Python

原文由 apathyman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题