Коротко: Apache Airflow — це відкрита платформа для оркестрації data pipeline, де логіка описується як Python-код у вигляді DAG (Directed Acyclic Graph). Стаття охоплює встановлення Airflow локально, написання першого робочого DAG і типові помилки, яких варто уникати з самого початку. Підходить тим, хто вже знає Python базово і хоче автоматизувати ETL або побудувати перший data pipeline.

Вступ

Більшість data pipeline починаються однаково: скрипт на Python, запуск через cron, і спочатку все виглядає зручно. Але з часом скриптів стає більше, між ними з’являються залежності, і відстежити що, коли і чому впало — стає справжнім болем.

Apache Airflow вирішує саме цю проблему. Він дозволяє описати pipeline як код, запускати задачі за розкладом або залежностями, моніторити виконання через UI і перезапускати окремі кроки без повного рестарту.

У цій статті розберемо: що таке DAG і як він працює, як встановити Airflow локально за кілька команд, як написати перший ETL-pipeline з нуля і яких помилок найчастіше припускаються початківці. А якщо Python для вас ще не зовсім рідна мова — спочатку рекомендуємо звернути увагу на курс «Програмування на Python» від Data Lab, щоб писати DAG впевнено.


Що таке Apache Airflow і навіщо він потрібен дата-інженеру?

Від cron до оркестрації: чому cron вже не вистачає

Cron — чудовий інструмент для простих задач. Але він нічого не знає про залежності між задачами, не вміє повторити кроки після збою, і не покаже вам наочно, де саме зупинився pipeline о третій ночі.

Оркестратор — це вже інший рівень. Він керує не просто розкладом, а логікою виконання: яка задача запускається після якої, що робити при помилці, як передати дані між кроками.

Apache Airflow — open-source інструмент оркестрації pipeline даних, який підтримує Apache Software Foundation. Він дозволяє описувати pipeline як Python-код, версіонувати його через Git, моніторити стан задач у веб-інтерфейсі і перезапускати окремі кроки без впливу на весь граф.

Airflow у стеку сучасного data engineer

Airflow посідає одне з ключових місць серед Must-have інструменти Data Engineer — поряд з dbt, Spark і хмарними сховищами даних. Він використовується в командах різного розміру: від невеликих стартапів до великих платформ з сотнями pipeline.

Головна перевага — pipeline як код. Це означає code review, версіонування, тестування і стандартний Git-workflow. Для команди це значно зручніше, ніж GUI-конфігуратори або таблиці в Confluence.


Що таке DAG в Airflow і як він працює?

DAG, Task, Operator — три кити Airflow

DAG (Directed Acyclic Graph) — це направлений ациклічний граф задач. Простіше кажучи: набір кроків із чітко визначеним порядком виконання, де немає циклів. DAG описує що робити і в якому порядку, але сам по собі нічого не виконує.

Task — одна атомарна одиниця роботи всередині DAG. Наприклад: завантажити файл, трансформувати таблицю, надіслати повідомлення.

Operator — шаблон задачі, який визначає як виконується конкретний крок. Найпоширеніші:

  • PythonOperator — виконує Python-функцію
  • BashOperator — виконує bash-команду
  • EmailOperator — надсилає email
  • SQLExecuteQueryOperator — виконує SQL-запити через SQL-провайдери (зокрема до PostgreSQL, MySQL та інших сумісних БД)

Як Airflow виконує задачі: Scheduler, Executor, Worker

Scheduler — компонент, який постійно моніторить DAG-файли і вирішує, які задачі готові до запуску. Він перевіряє розклад, залежності та стан попередніх задач.

Executor визначає як задачі виконуються технічно. Тут є кілька варіантів:

  • LocalExecutor — паралельне виконання на одній машині
  • CeleryExecutor / KubernetesExecutor — розподілене виконання на кількох вузлах

Worker — процес, який безпосередньо виконує код задачі.

Metadata DB зберігає стан усіх DAG і задач: коли запустилися, який статус, логи. За замовчуванням це SQLite, але для серйозного використання потрібен PostgreSQL або MySQL.

Таблиця: ключові компоненти Airflow та їх роль

КомпонентРольАналогія для розуміння
DAGОпис pipeline: задачі та залежностіМаршрутна карта
TaskОдин крок у pipelineКрок маршруту
OperatorШаблон виконання задачіІнструмент для кроку
SchedulerВирішує коли і що запускатиДиспетчер
ExecutorВизначає як задачі виконуються технічноВиконавець
WorkerПроцес, що безпосередньо виконує кодРобітник
Metadata DBЗберігає стан DAG і задачЖурнал обліку

Як встановити Apache Airflow локально: покроковий tutorial

Вимоги перед встановленням

  • Python 3.10 або новіший (мінімально підтримується 3.9, але рекомендується 3.10+)
  • pip актуальної версії
  • Linux або macOS — або WSL2 на Windows (нативний Windows не рекомендується для Airflow)
  • Мінімум 4 ГБ RAM для комфортної роботи

Встановлення через pip у віртуальне середовище

Airflow має складне дерево залежностей, тому встановлення без constraint-файлу часто призводить до конфліктів версій. Constraint-файл фіксує перевірені комбінації пакетів для конкретної версії Airflow.

# Створюємо і активуємо віртуальне середовище
python3 -m venv airflow-env
source airflow-env/bin/activate

# Встановлюємо змінну для домашньої директорії Airflow
export AIRFLOW_HOME=~/airflow

# Визначаємо версію Airflow і Python
AIRFLOW_VERSION=3.2.0
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"

# Формуємо URL constraint-файлу
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"

# Встановлюємо Airflow з constraint-файлом
pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"

Ініціалізація бази даних і запуск веб-сервера

Варіант 1 – найпростіший старт:

# Одна команда запускає все: ініціалізує БД, створює користувача, 
# стартує scheduler, api-server і triggerer 

airflow standalone

# Після запуску у терміналі буде показано логін і пароль адміністратора. 
# UI доступний на http://localhost:8080

Варіант 2 – ручний запуск окремих компонентів

# Ініціалізуємо та мігруємо метабазу (замість застарілого db init)
airflow db migrate

# Створюємо адміністратора
airflow users create \
    --username admin \
    --firstname Admin \
    --lastname User \
    --role Admin \
    --email admin@example.com \
    --password admin

# Запускаємо веб-сервер (у першому терміналі)
airflow api-server --port 8080

# Запускаємо scheduler (у другому терміналі)
airflow scheduler

# Запускаємо DAG processor (у третьому терміналі)
airflow dag-processor

Практична порада: SQLite підходить тільки для локального навчання. У продакшені використовуй PostgreSQL або MySQL — вони підтримують паралельне виконання задач і стабільніші під навантаженням.

Перший погляд на Airflow UI

Відкрий http://localhost:8080 і увійди з кредентіалами, які задав при створенні користувача (або які airflow standalone показав у терміналі). На головній сторінці — список DAG з їх статусами.

Основні елементи UI:

  • Graph View — візуальне відображення залежностей між задачами
  • Grid View — матриця запусків з вбудованим Gantt-чартом; рядки — задачі, колонки — запуски
  • Calendar View — повернувся в Airflow 3.1 після відсутності в 3.0; показує запуски у вигляді календаря з фільтрацією за станами
  • Кольори статусів: зелений — success, червоний — failed, жовтий — running, сірий — skipped

Пишемо перший DAG на Python: airflow dag python приклад з поясненням

Структура файлу DAG: що обов’язково, а що опціонально

Файл DAG — звичайний Python-файл, який Airflow парсить при кожному скані папки dags/.  Airflow регулярно парсить DAG-файли як звичайні Python-модулі: код на рівні модуля виконується під час такого парсингу, а потім із файлу завантажуються об’єкти DAG. Тому будь-яка важка логіка (підключення до БД, HTTP-запити, читання великих файлів) на верхньому рівні модуля сповільнюватиме роботу планувальника і DAG processor.

Мінімальний DAG складається з:

  1. Імпортів
  2. Об’єкта DAG з параметрами
  3. Хоча б одного оператора (Task)
  4. Визначення залежностей між задачами

Визначаємо задачі та залежності між ними

Ось повний робочий приклад простого ETL-pipeline:

from datetime import datetime
from airflow.sdk import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator

# default_args застосовуються до всіх задач у DAG
default_args = {
    'owner': 'data-lab',
    'retries': 1,
}

def transform_data():
    """Трансформація даних — тут буде реальна логіка"""
    print("Трансформація: очищення та нормалізація даних")

def load_data():
    """Завантаження даних у сховище"""
    print("Завантаження: запис результатів у базу даних")

with DAG(
    dag_id='first_etl_pipeline',          # унікальний ідентифікатор DAG
    description='Простий ETL-pipeline для демонстрації',
    schedule='@daily',                    # розклад запуску (schedule_interval deprecated у 2.x)
    start_date=datetime(2024, 1, 1),       # фіксована дата початку
    catchup=False,                         # не запускати пропущені runs
    default_args=default_args,
    tags=['tutorial', 'etl'],
) as dag:

    # Task 1: Extract — завантаження даних
    extract = BashOperator(
        task_id='extract',
        bash_command='echo "Завантаження даних з джерела..." && sleep 2',
    )

    # Task 2: Transform — трансформація
    transform = PythonOperator(
        task_id='transform',
        python_callable=transform_data,
    )

    # Task 3: Load — запис результатів
    load = PythonOperator(
        task_id='load',
        python_callable=load_data,
    )

    # Визначаємо порядок виконання
    extract >> transform >> load

Оператор >> задає залежності: extract виконується першим, після нього — transform, потім load. Якщо потрібно розгалуження, можна писати extract >> [transform_a, transform_b] >> load.

Примітка: Починаючи з Airflow 3.0, рекомендується імпортувати DAG та декоратори з нового стабільного namespace airflow.sdk. Старий імпорт from airflow import DAG поки працює для зворотної сумісності, але airflow.sdk гарантує стабільність API у майбутніх версіях.

5 параметрів DAG, які треба знати з першого дня

  • dag_id — унікальний ідентифікатор DAG у межах всього Airflow-інстансу. Дублікати призведуть до конфлікту.
  • schedule — розклад запуску: cron-вираз ('0 6 * * *'), preset ('@daily', '@hourly') або None для ручного запуску.
  • start_date — дата, з якої Airflow починає відраховувати розклад. Завжди вказуй фіксовану дату, а не datetime.now().
  • catchup — якщо True, Airflow запустить всі пропущені runs від start_date до поточного моменту. Для нових DAG зазвичай встановлюй False.
  • default_args — словник параметрів за замовчуванням для всіх задач: owner, retries, retry_delay, email_on_failure тощо.

Запускаємо DAG і читаємо результат у UI

Збережи файл у папку ~/airflow/dags/. Через кілька секунд DAG з’явиться в UI або у виводі команди:

airflow dags list

Щоб запустити DAG вручну через CLI:

airflow dags trigger first_etl_pipeline

Або натисни кнопку “Trigger DAG” у UI. Після запуску перейди в Graph View і клікни на будь-яку задачу — там є кнопка “Log”, де видно весь вивід виконання.

Позиція автора: що варто зрозуміти про DAG з першого разу

DAG — це декларація залежностей, а не послідовний скрипт. Airflow парсить DAG-файл регулярно (кожні кілька секунд), щоб оновити граф у метабазі. Тому код на рівні модуля виконується при кожному парсингу, а не тільки при запуску pipeline.

На практиці це означає: вся бізнес-логіка має бути всередині операторів або callable-функцій, а не на верхньому рівні файлу. Це одна з тих речей, яка не очевидна з першого погляду, але стає зрозумілою після першого ж інциденту з повільним scheduler’ом.


Типові помилки початківців в Apache Airflow і як їх уникнути

Помилки при написанні DAG

Помилка 1: catchup і поведінка за замовчуванням залежить від версії.
У Airflow 2.x параметр catchup за замовчуванням мав значення True — якщо встановити start_date=datetime(2023, 1, 1) і не вказати catchup=False, Airflow запускав усі пропущені runs за весь цей час. У Airflow 3.0 це виправлено: catchup_by_default тепер False за замовчуванням. Проте явно вказувати catchup=False у коді DAG — досі хороша практика для читабельності та сумісності з різними версіями.

Помилка 2: datetime.now() у start_date.
start_date обчислюється при кожному парсингу DAG-файлу. Динамічна дата призводить до непередбачуваної поведінки планувальника. Використовуй фіксовану дату: datetime(2024, 1, 1).

Помилка 3: важкі операції на рівні модуля.
Підключення до бази даних, HTTP-запити або читання файлів поза межами операторів — все це виконується при кожному парсингу DAG. Scheduler починає гальмувати, і причину знайти непросто.

Помилка 4: використання execution_date у Airflow 3.x.
У Airflow 2.x execution_date відповідав початку розкладного інтервалу, а не моменту реального запуску — це часто плутало початківців. У Airflow 3.0 execution_date повністю видалений з контексту task instance і його використання викличе помилку DAG. Замість нього використовуй logical_date (або data_interval_start / data_interval_end для роботи з інтервалами)

Помилка 5: ігнорування ідемпотентності.
Задачі мають давати однаковий результат при повторному запуску з тими самими параметрами. Якщо задача вставляє рядки без перевірки на дублікати — повторний запуск зламає дані.

Помилки при налаштуванні середовища

Помилка 6: секрети в коді DAG.
Паролі, токени та ключі API прямо в DAG-файлі — серйозна проблема безпеки. Використовуй Airflow Connections і Variables через UI або CLI, або зовнішні secret backends (AWS Secrets Manager, HashiCorp Vault).

Помилка 7: запуск тільки api-server без scheduler.
Без активного scheduler жоден DAG не запуститься автоматично. Типова ситуація: UI відкривається, DAG видно, але runs не з’являються. Перевір, чи запущений airflow scheduler в окремому процесі.


FAQ: питання про Apache Airflow для початківців

Питання: Що таке Apache Airflow і навіщо він потрібен?
Відповідь: Apache Airflow — це відкрита платформа для програмного створення, планування та моніторингу pipeline даних. Вона дозволяє описувати послідовності задач у вигляді DAG на Python, версіонувати їх через Git і відстежувати виконання через веб-інтерфейс. Airflow широко використовується в data engineering для автоматизації ETL-процесів і оркестрації складних потоків даних — там, де cron вже не справляється з логікою залежностей і обробкою помилок.

Питання: Як створити перший DAG в Apache Airflow?
Відповідь: Щоб створити перший DAG, встанови Airflow через pip з constraint-файлом, підготуй метабазу командою airflow db migrate і напиши Python-файл з описом задач та їх залежностей.. Мінімальний DAG містить об’єкт DAG з параметрами, хоча б один оператор (наприклад, PythonOperator або BashOperator) і визначення порядку виконання через оператор >>. Файл розміщується у папці dags/ всередині AIRFLOW_HOME, після чого Scheduler автоматично його підхоплює.

Питання: Apache Airflow vs Prefect — що краще для початківців?
Відповідь: Airflow — більш зрілий інструмент з великою спільнотою, широкою екосистемою провайдерів і великою кількістю прикладів у відкритому доступі. Початкове налаштування складніше, але знання Airflow є більш затребуваним на ринку праці в data engineering. Prefect має сучасніший Python API і простіший старт, що робить його зручним для невеликих команд. Якщо мета — кар’єра data engineer, Airflow варто знати.

Питання: Чи є безкоштовна версія Apache Airflow?
Відповідь: Apache Airflow — повністю безкоштовний open-source інструмент з ліцензією Apache 2.0. Його можна розгорнути самостійно на будь-якому сервері або локально. Існують хмарні managed-рішення: Google Cloud Composer, Amazon MWAA і Astronomer — вони платні, але знімають операційний тягар з команди. Для навчання і розробки цілком достатньо безкоштовної локальної установки через pip або офіційного docker-compose від Airflow.

Питання: Які помилки найчастіше роблять початківці при роботі з Apache Airflow?
Відповідь: Найпоширеніші помилки: важкий код на рівні модуля DAG-файлу (виконується при кожному парсингу), використання datetime.now() у start_date замість фіксованої дати, ввімкнений catchup=True з давньою start_date, і нерозуміння того, що execution_date — це початок інтервалу, а не момент реального запуску. Також часто зберігають секрети прямо в коді DAG замість Airflow Connections і Variables.


Підсумок і що далі: як розвиватись після першого DAG

Наступні кроки у вивченні оркестрації pipeline даних

Після першого робочого DAG є кілька напрямків для розвитку:

  • TaskFlow API — сучасний спосіб писати DAG у Airflow 3.x через декоратори @task
  • XComs — механізм передачі невеликих даних між задачами
  • Airflow Connections і Variables — безпечне зберігання конфігурацій і секретів
  • Кастомні Operators — коли стандартних операторів недостатньо
  • Деплой через Docker Compose — офіційний спосіб запустити повноцінний стек Airflow локально або на сервері

Якщо хочеш освоїти Airflow системно — разом з dbt, Spark і побудовою повноцінних data pipeline — рекомндуємо звернути увагу на спеціалізацію Analytics & Data Engineer. Це структурований шлях від основ до реальних інструментів продакшн-рівня за 5 місяців.

Найкращий спосіб закріпити матеріал — запустити перший DAG сьогодні. Навіть простий pipeline з трьох задач дає реальне розуміння того, як Airflow думає і як з ним працювати далі.