Перейти к содержимому
TelegramGitHub

Data Pipelines with Apache Airflow, глава 1: Знакомство с Apache Airflow

Главная мысль: pipeline лучше описывать как граф из небольших задач. Airflow запускает этот граф по расписанию, следит за порядком задач и помогает чинить сбои. Он создан для batch-pipelines, а не для потоков.

Компоненты Airflow 3: DAG processor, scheduler, API server, workers, triggerer и metastore

Пример из книги: дашборд погоды. У него три шага: взять прогноз из API, очистить данные, отправить их в дашборд.

  • Каждый шаг это task. На графе он выглядит как узел.
  • Порядок шагов это зависимость. На графе это стрелка от одной task к другой.
  • Такой граф называют DAG: directed acyclic graph.
  • Directed значит, что у стрелки есть направление.
  • Acyclic значит, что циклов нет. Иначе task A ждёт B, а B ждёт A, и обе стоят.

Как выполнить такой граф, понятно из простого алгоритма:

  1. Найди незавершённые tasks, у которых все upstream-задачи готовы.
  2. Поставь их в очередь и выполни.
  3. Повтори, пока не закончатся все tasks.

Airflow делает то же самое. Сверху он добавляет логику расписания.

Второй пример: компания продаёт зонты. Нужно обучить модель, которая связывает продажи с погодой.

Граф pipeline для прогноза спроса на зонты: две независимые ветки и общий join

Что даёт граф вместо одного большого скрипта:

ПлюсПример
ПараллельностьВетки погоды и продаж не связаны, их можно считать одновременно
Частичный перезапускУпала clean_sales. Перезапускаем её и tasks после неё, а не весь скрипт
ЧитаемостьПо графу видно структуру pipeline
Мелкие шагиКаждый шаг можно менять и проверять отдельно

Задача запускать граф зависимых задач старая. Книга сравнивает много инструментов: Airflow, Luigi, Dagster, Prefect, Argo, Oozie, Azkaban и другие.

Главные различия:

  • Как описан workflow. Oozie использует XML. Это читаемо, но негибко. Airflow и Luigi используют код. Это гибко, но код надо тестировать.
  • Что встроено. В Make и самописных скриптах нет расписания. Нужен cron. Airflow даёт расписание, UI и мониторинг в одной платформе.

Airflow написан на Python. DAG описывается в Python-файле (DAG file). В Airflow 3 появилась возможность писать на других языках, но основной остаётся Python.

Плюсы кода:

  • DAG можно генерировать динамически, например из конфигов.
  • Task может сделать всё, что умеет Python.
  • Много providers для баз, облаков и больших данных.
КомпонентЧто делает
DAG processorЧитает DAG-файлы, парсит их и кладёт результат в metastore
SchedulerПроверяет расписание, создаёт DAG runs, ставит tasks в очередь
WorkersБерут tasks из очереди и выполняют их
TriggererЖдёт внешние события для deferred tasks, чтобы worker не простаивал
API serverДаёт веб-интерфейс и служит шлюзом между компонентами и базой

Ещё есть metastore: база, где хранятся DAG, runs и состояния tasks. По книге, все обращения к базе идут через API server.

  1. DAG processor разбирает файлы и сохраняет DAG.
  2. Scheduler смотрит, прошёл ли schedule interval.
  3. Для каждого запущенного DAG он проверяет зависимости tasks.
  4. Готовые tasks уходят в очередь на workers.
  5. Tasks, которые ждут внешний ресурс, уходят в triggerer.
  6. Цикл повторяется.
  • В UI есть обзор всех DAG, graph view и grid view.
  • Grid view самый полезный. Он показывает историю runs, статусы tasks и логи.
  • Упавшую task Airflow может повторить (retries), с паузой между попытками.
  • Если retries не помогли, task получает статус failed. Можно настроить уведомления.
  • В UI можно сделать clear для task. Тогда она и её downstream tasks запустятся заново.

Расписание Airflow делит время на интервалы: день, неделя и так далее. Каждый run знает свой интервал.

  • Incremental pipeline. Каждый run обрабатывает только данные своего интервала (delta), а не всю таблицу.
  • Backfilling. Можно запустить DAG за прошлые интервалы и заполнить историю.
  • Reprocessing. Изменили код? Сделайте clear старых runs, и данные пересчитаются.

Подробности в главе 3.

Подходит, если нужно:

  • запускать сложные workflow по расписанию или по событию;
  • работать с данными по интервалам времени;
  • подключаться ко многим системам (PostgreSQL, BigQuery и другие);
  • применять практики разработки: код, git, review;
  • делать backfilling.

Плюсы платформы: open source, нет vendor lock-in, давно в production, есть managed-версии.

Не подходит, если:

  • нужен streaming, то есть обработка отдельных событий в реальном времени;
  • команда не пишет код. Лучше инструмент с GUI, например Azure Data Factory;
  • нужны data lineage и data versioning из коробки. Airflow поддерживает OpenLineage, но этого мало;
  • структура DAG меняется каждый день.

Большие DAG требуют инженерной дисциплины: переиспользуемые DAG, модульные tasks, принципы DRY и SRP.

Проверено на Airflow 3.4: DAG проходит airflow dags test.

Так выглядит минимальный DAG из двух tasks. Имена придуманы для примера.

import pendulum
from airflow.providers.standard.operators.bash import BashOperator
from airflow.sdk import DAG
with DAG(
dag_id="demo_weather_board",
start_date=pendulum.datetime(2025, 1, 1, tz="UTC"),
schedule=None,
):
fetch = BashOperator(task_id="fetch", bash_command="echo fetch")
publish = BashOperator(task_id="publish", bash_command="echo publish")
fetch >> publish
ТерминЗначение
DAGDirected acyclic graph: граф tasks без циклов
TaskОдин шаг pipeline, узел графа
DAG filePython-файл, который описывает DAG
DAG processorКомпонент, который парсит DAG-файлы
SchedulerКомпонент, который решает, когда и что запускать
WorkerПроцесс, который выполняет task
TriggererКомпонент для deferred tasks, ждущих события
MetastoreБаза метаданных Airflow
ProviderПакет интеграции с внешней системой
BackfillingЗапуск DAG за прошлые интервалы
Incremental loadОбработка только новых данных за интервал
  • Режьте pipeline на небольшие tasks. Тогда сбой стоит дешёвого перезапуска, а не полной перегрузки.
  • Принимайте Airflow как orchestrator. Он запускает работу в warehouse, dbt, Spark. Тяжёлую обработку данных не делайте внутри worker.
  • Для потоковых данных (Kafka и подобные) берите другие инструменты. Airflow можно использовать для batch-слоя вокруг них.
  • Опишите DAG так, чтобы каждый run брал данные своего интервала. Тогда backfilling работает сам.
  • Помните: DAG это код. Храните его в git и проверяйте через review.
  1. Почему граф должен быть acyclic? Что случится при цикле?
  2. Что выигрывает pipeline в виде графа по сравнению с одним скриптом?
  3. Какую роль играют scheduler, DAG processor, workers и triggerer?
  4. В каких случаях Airflow не стоит брать?

Предыдущая: Обзор книги. Следующая: Анатомия DAG.