我试图每天在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
)启动(失败)。
一个“好”的人:
一个“坏”的人:
答案 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)
可能也可以工作。
这不能解释为什么我将日期设置得很远,但是却无法运行。 ¯\ _(ツ)_ /¯