DAG «Гонца» уже умеет выгружать заказы и считать выручку. Его выкладывают на сервер 5 октября. Отто хочет, чтобы отчёт был готов к началу рабочего дня, а бухгалтерия просит не забыть про первые числа октября: с 1-го у курьеров новые тарифы, и посчитать нужно всё с начала месяца. Значит, DAG должен знать три вещи: во сколько запускаться, с какой даты начинается его история и что делать с днями, которые прошли до его включения.
Абонемент в бассейн
Ты купил абонемент на утренние тренировки: каждый день в 06:00, действует с 1 октября. Но пришёл в бассейн впервые только 5 октября. Что с пропущенными днями?
У одного бассейна правило строгое: что пропустил, то сгорело, начинаешь с сегодняшней тренировки. У другого можно отходить все пропущенные: в субботу придёшь и проплывёшь четыре тренировки подряд.
У DAG те же три параметра: расписание («каждый день в 06:00»), дата начала («действует с 1 октября») и правило для пропущенных дней.
Расписание
Параметр schedule говорит, когда запускать DAG. Обычно это cron-выражение из пяти полей: минута, час, день месяца, месяц, день недели.
| Выражение | Когда |
|---|---|
0 6 * * * | каждый день в 06:00 |
30 2 * * 1-5 | по будням в 02:30 |
0 */6 * * * | каждые шесть часов: 00:00, 06:00, 12:00, 18:00 |
@daily | каждый день в полночь, то же, что 0 0 * * * |
@hourly | в начале каждого часа |
None | никогда сам, только вручную |
Airflow считает расписание в UTC, если не сказать иначе. 06:00 UTC это 11:00 по Екатеринбургу, где работает Отто. Для «Гонца» это поздновато, но в этом блоке мы держим всё в UTC, чтобы не путаться.
Дата начала и logical_date
start_date это дата, с которой начинается история DAG. Это не «когда DAG впервые запустится», а «начиная с какого момента расписание имеет смысл».
Каждый запуск по расписанию получает logical_date: момент расписания, к которому он относится. Запуск «за 3 октября 06:00» имеет logical_date 2026-10-03 06:00, даже если его выполнили неделей позже. Задачи берут эту дату из контекста запуска, например через параметр ds, и понимают, за какой день работать. Поэтому запуск за прошлую дату обработает именно прошлый день, а не сегодняшний.
Ручной запуск из интерфейса или командой airflow dags trigger в Airflow 3 получает пустой logical_date: он ни к какому моменту расписания не относится.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.