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

2024-06-15 16:51:40 发布

您现在位置:Python中文网/ 问答频道 /正文

当我安排DAG每天在特定时间运行时,DAG根本不会执行。 但是,当我重新启动Airflow Web服务器和调度器时,DAG将在该特定日期的计划时间执行一次,而不会从第二天开始执行。 我使用的是气流版本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)

我做错什么了吗?


Tags: fromimportbashdefaultdatetimeonemail时间
2条回答

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

示例:

你做一个dag,然后在午夜的气流中直播。今天(20XX-01-01 00:00:00)也是开始日期,但它是硬编码的("start_date":datetime(20XX,1,1))。日程间隔是每天的,就像你的一样(3 2 * * *)。

此dag第一次排队等待执行是20XX-01-02 02:03:00,因为这是间隔时段结束时。如果你看到你的dag正在运行,它应该有一个开始日期时间大约一天之后的日程日期。

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

有关回填的详细信息(此常见stackoverflow问题的另一面),请查看文档或此问题: Airflow not scheduling Correctly Python

根据时间表,你的DAG应该每天凌晨2:03运行。我怀疑开始日期可能会影响它。你能把它硬编码成“开始日期”:datetime.datetime(2016,11,01)然后再试一次吗。

相关问题 更多 >