Concurrency 气流:Dag计划每隔几秒钟进行两次

Concurrency 气流:Dag计划每隔几秒钟进行两次,concurrency,cron,airflow,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_ru

我试图每天只在
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 UTC后58秒”(至少根据他们的名字)。所以第一个运行良好,似乎没有其他运行。。。一旦完成运行,第二次运行(计划在
00:15:
58
进行的运行)开始(并失败)

“好”的一个:

“坏”的一个:


能否检查计划间隔参数?

附表_interval='15 0****'。cron计划只需要5个参数,我看到了一个额外的星。
另外,你能确定开始日期吗?

开始日期:日期时间(2019年11月10日)

这看起来像是将
开始日期设置为2天前,而不是1天前

dag = DAG(
    'my_dag',
    ...
    start_date=airflow.utils.dates.days_ago(2),
    ...
)
我不知道为什么

我只是有一个理论。Maaaaaybe(可能很大)问题在于,因为
.days\u ago(…)
将UTC
datetime
设置为小时/分钟/秒
0
,然后减去参数中指示的天数,只说“一天以前”或甚至“一天十分钟以前”没有把
开始日期
放在下一个时段(
00:15
),这不知怎么搞混了

让我们重复一下,调度程序每隔一个调度周期运行一次作业 在开始日期之后,在期间结束时

所以,这段时间的结束时间是00:15。。。如果我的理论是正确的,那么做
aiffair.utils.dates.days\u ago(1)-timedelta(minutes=16)
也可能有效


这并不能解释为什么如果我在过去设定了一个非常遥远的日期,它就不会运行。¯\_(ツ)_/“

Hi Dakshin.谢谢你的回答。所以第六个参数显然是工作日(或年)(链接到维基百科)我也尝试了固定的开始日期和动态的很久以前的开始日期(
start\u date=aiffort.utils.dates.days\u ago(15)
)如果没有luckDid,在使用另一个
schedule\u interval
设置运行DAG后,您会更改
schedule\u interval
。@SergiyKolesnikov,我有可能会更改(我不太记得了,TBH,但很可能在我的测试中我尝试过更改这些设置)试着像my_dag_v1一样将dag_id更改为smth,看看是否有帮助。确保之后不要更改日程安排。