气流:排定两次间隔几秒钟

时间:2019-11-27 21:55:18

标签: concurrency cron airflow

我试图每天在00:15:00(午夜15分钟)仅运行一次DAG,但是它被安排了两次,相隔几秒钟。

dag = DAG(
    'my_dag',
    default_args=default_args,
    start_date=airflow.utils.dates.days_ago(1) - timedelta(minutes=10),
    schedule_interval='15 0 * * * *',
    concurrency=1,
    max_active_runs=1,
    retries=3,
    catchup=False,
)

Dag的主要目标是检查新电子邮件,然后检查SFTP目录中的新文件,然后运行“合并”任务以将这些新文件添加到数据库中。

所有工作都是Kubernetes吊舱:

email_check = KubernetesPodOperator(
    namespace='default',
    image="g.io/email-check:0d334adb",
    name="email-check",
    task_id="email-check",
    get_logs=True,
    dag=dag,
)
sftp_check = KubernetesPodOperator(
    namespace='default',
    image="g.io/sftp-check:0d334adb",
    name="sftp-check",
    task_id="sftp-check",
    get_logs=True,
    dag=dag,
)
my_runner = KubernetesPodOperator(
    namespace='default',
    image="g.io/my-runner:0d334adb",
    name="my-runner",
    task_id="my-runner",
    get_logs=True,
    dag=dag,
)
my_runner.set_upstream([sftp_check, email_check])

因此,问题在于,DAG 预定的运行似乎间隔了几秒钟。它们不是同时运行 ,但是第一个运行完毕后,第二个启动。

这里的问题是my_runner作业只打算每天运行一次:它试图创建一个以日期为后缀的文件,如果该文件已经存在,则会引发异常,因此第二次运行总是会引发异常(因为当天的文件已经在第一次运行中正确创建了)

由于一幅(或两幅)图像值一千个单词,因此就可以了:

您会看到有一个首次跑步的时间安排为“ 00:15之后22秒”(没关系,有时在这里和那里会改变几秒钟),然后第二个似乎总是安排在世界标准时间00:15之后的 58 秒” (至少根据他们得到的名字而定)。因此,第一个运行正常,似乎没有其他运行。。。一旦完成运行,第二个运行(预定为00:15: 58 )启动(失败)。

一个“好”的人:

enter image description here

一个“坏”的人:

enter image description here

2 个答案:

答案 0 :(得分:0)

可以检查调度间隔参数吗? schedule_interval='15 0 * * * *'. The cron schedule takes only 5 parameters and I see an extra star. 另外,您可以确定开始日期吗? start_date: datetime(2019, 11, 10)

答案 1 :(得分:0)

start_date设置为2天而不是1天就可以了

dag = DAG(
    'my_dag',
    ...
    start_date=airflow.utils.dates.days_ago(2),
    ...
)

我不知道为什么。

我只是有一个理论。 Maaaaaaybe(可能是个大问题)是因为.days_ago(...)将UTC datetime设置为小时/分钟/秒设置为0,然后减去论点中指定的天数,只是说“ 一天前”或什至“ 一天十分钟前”在下一个期间(start_date)都没有放置00:15那是莫名其妙地混淆了气流?

  

让我们重复一遍,调度程序将您的工作运行一次schedule_interval   在开始日期之后,到该期间的结束。

https://airflow.readthedocs.io/en/stable/scheduler.html#scheduling-triggers

因此,期末将是00:15 ...如果我的理论正确,那么airflow.utils.dates.days_ago(1) - timedelta(minutes=16)可能也可以工作。

这不能解释为什么我将日期设置得很远,但是却无法运行。 ¯\ _(ツ)_ /¯