Раздел 26 · Data Engineering

Первый DAG: расписание и параметры

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.