# Управление временем

В этом практическом руководстве вы освоите ключевые аспекты работы со временем в Airflow. Вы узнаете, как правильно настраивать расписания для ваших DAG, понимать внутреннюю логику временных меток и эффективно управлять историческими данными. Поскольку бизнес-процессы часто напрямую зависят от временных параметров запуска, понимание этих механизмов критически важно для любого дата-инженера.

# Настройка автоматических запусков

Когда вы создаете свой первый пайплайн, вы уже сталкивались с возможностью запускать DAG по расписанию через параметр `schedule_interval`. По умолчанию этот параметр равен `None`, что означает ручной запуск без автоматического расписания.

В приведенном примере создается DAG с идентификатором "daily_data_processing", который будет запускаться ежедневно. DAG использует дату начала 1 января 2020 года и параметр catchup=False, что означает, что пропущенные запуски обрабатываться не будут. Владелец DAG - команда data_team, и для задач в DAG установлена одна попытка повторного запуска при ошибках.

```python
dag = DAG(
	dag_id="daily_data_processing",
	schedule_interval="@daily",
	start_date=dt.datetime(2020, 1, 1),
	catchup=False,
	default_args={
		'owner': 'data_team',
		'retries': 1,
	}
)
```

Важно понимать, что Airflow требует указания даты начала работы (`start_date`) для любого DAG с расписанием. Система использует эту дату как отправную точку и планирует первый запуск, добавляя к ней интервал из `schedule_interval`.

## Готовые шаблоны расписания

Airflow предоставляет удобные встроенные шаблоны для самых распространенных сценариев:

- `@once` — однократный запуск
- `@hourly` — каждый час
- `@daily` — ежедневно
- `@weekly` — еженедельно  
- `@monthly` — ежемесячно
- `@yearly` — ежегодно

Для более сложных сценариев можно использовать стандартный cron-формат, например: `"0 12 * * 1-5"` для запуска в 12:00 по будням.

# Работа с историческими данными

## Механизм "догонки" (catchup)

Когда вы создаете DAG с исторической датой начала, Airflow предлагает мощный механизм автоматического пересчета пропущенных периодов через параметр `catchup`.

В этом примере создается DAG с идентификатором "historical_data_processing", который запускается ежедневно и имеет дату начала 1 января 2021 года. Параметр catchup=True означает, что Airflow будет автоматически запускать DAG для всех пропущенных дней с указанной даты начала до текущего момента. Владелец DAG - команда analytics_team, и для задач установлено две попытки повторного запуска при ошибках.

Когда вы создаете DAG с исторической датой начала, Airflow предлагает мощный механизм автоматического пересчета пропущенных периодов через параметр `catchup`.

```python
dag = DAG(
	dag_id="historical_data_processing",
	schedule_interval="@daily",
	start_date=dt.datetime(2021, 1, 1),
	catchup=True,
	default_args={
		'owner': 'analytics_team',
		'retries': 2,
	}
)
```

При `catchup=True` система автоматически выполнит все пропущенные запуски от указанной даты начала до текущего момента. Это особенно полезно при первом запуске DAG для обработки накопившихся исторических данных.

Если ваш бизнес-сценарий не требует пересчета истории или вы хотите начать обработку только с текущего периода, установите `catchup=False`. В этом случае Airflow будет планировать только ближайшие запуски согласно расписанию.

## Ручная перезаливка данных (backfill)

Иногда возникает необходимость пересчитать данные за конкретный период времени. Для этого Airflow предоставляет команду `backfill`:

```bash
airflow dags backfill \
--start-date 2022-01-01 \
--end-date 2022-03-01 \
the_main_dag
```

Эта команда запустит DAG `the_main_dag` для каждого интервала между указанными датами, позволяя гибко управлять перерасчетом исторических данных.

# Временные зоны и локализация

Важный момент: **все вычисления в Airflow по умолчанию выполняются в UTC** (на 3 часа меньше московского времени). Это стандартная практика для распределенных систем, но требует особого внимания при работе с локальными временными метками.

Вы можете:
- Настроить глобальную временную зону в конфигурационном файле Airflow
- Указать временную зону явно при инициализации DAG через параметр `tz`

Однако рекомендуется придерживаться UTC во всех расчетах и преобразовывать временные метки только при выводе результатов для конечных пользователей. Это минимизирует ошибки и упрощает отладку.

# Практические рекомендации

1. **Всегда тестируйте расписание** на небольшом временном интервале перед запуском в продакшен
2. **Используйте `catchup=False`** для DAG, которые не требуют исторических пересчетов
3. **Планируйте запуски с учетом UTC**, особенно если ваша команда работает в разных часовых поясах
4. **Документируйте временные зависимости** в коде DAG для других разработчиков

Понимание временных механизмов Airflow — ключ к созданию надежных и предсказуемых пайплайнов. Правильная настройка расписаний и управление историческими данными позволяют автоматизировать сложные бизнес-процессы без ручного вмешательства.