# Управление временем В этом практическом руководстве вы освоите ключевые аспекты работы со временем в 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 — ключ к созданию надежных и предсказуемых пайплайнов. Правильная настройка расписаний и управление историческими данными позволяют автоматизировать сложные бизнес-процессы без ручного вмешательства.