Files
airflow-manual/airflow-docker/educational-tasks.md
T
ddadmin af6b0a9fae refactor(manual): упрощение архитектуры учебного пайплайна и документации
- Зачем:
  - сделать примеры более доступными для начинающих, убрав лишнюю архитектурную сложность (хелперы, внешние SQL файлы).
  - сфокусировать обучение на самом Airflow, а не на структуре Python-проекта.
- Что:
  - консолидирована логика: DDL и вспомогательные функции перенесены из helpers/ и sql/ напрямую в csv_to_postgres.py и csv_to_postgres_dq.py.
  - удалена избыточная инфраструктура: папки sql/, tests/, helpers/ и файл requirements.txt больше не содержат специфичных для этого пайплайна файлов.
  - упрощена работа с БД: использование PostgresHook напрямую в задачах вместо кастомных оберток.
  - исправлен порт PostgreSQL для метаданных Airflow (5433 → 5434) в README.md и educational-setup-plan.md.
  - изменен путь генерации CSV на /opt/airflow/data/output в csv_to_postgres.py.
  - добавлен шаблон data/*.csv в .gitignore.
  - обновлен комментарий в sql_basic_dag.py о создании соединения.
  - исправлено описание практического задания в educational-tasks.md.
  - добавлены переводы строк в конце файлов csv_to_postgres.py и educational-setup-plan.md.
- Проверка:
  - запуск DAG-ов csv_to_postgres и csv_to_postgres_dq в Airflow UI.
2026-03-08 21:38:59 +03:00

22 KiB
Raw Blame History

Учебные задания по Apache Airflow

Этот документ содержит практические задания для закрепления знаний по Apache Airflow. Каждое задание соответствует одному из учебных DAG'ов и направлено на лучшее понимание конкретных концепций.

📋 Общие инструкции

Перед выполнением заданий:

  1. Убедитесь, что стенд Airflow запущен: docker-compose up -d
  2. Проверьте доступность интерфейса: http://localhost:8080
  3. Ознакомьтесь с соответствующим DAG'ом в интерфейсе Airflow

🚀 Задания для hello_world_dag.py

Цель: Освоить базовые концепции Airflow - создание задач, зависимости, операторы.

Задание 1: Модификация существующих задач

Сложность: 🟢 Начальная Время выполнения: 10-15 минут

Задача:

  • Откройте файл hello_world_dag.py
  • Измените текст в функциях print_hello(), print_date(), print_goodbye() на русский язык
  • Добавьте новую задачу, которая выводит текущую погоду (можно использовать фиктивные данные)

Цель задания: Понять структуру DAG, научиться добавлять и модифицировать задачи.

Задание 2: Изменение расписания

Сложность: 🟢 Начальная
Время выполнения: 5-10 минут

Задача:

  • Измените schedule_interval с ежедневного на еженедельное выполнение
  • Добавьте параметр max_active_runs для ограничения одновременных запусков
  • Проверьте изменения в интерфейсе Airflow

Цель задания: Освоить настройку расписания и параметров выполнения DAG.

Задание 3: Добавление BashOperator

Сложность: 🟡 Средняя Время выполнения: 15-20 минут

Задача:

  • Добавьте задачу с BashOperator, которая создает текстовый файл в папке /opt/airflow/data/output/
  • Настройте зависимости так, чтобы эта задача выполнялась между date_task и end_task
  • Убедитесь, что файл создается при каждом запуске DAG

Цель задания: Научиться работать с разными типами операторов.


🗄️ Задания для sql_basic_dag.py

Цель: Освоить работу с базами данных через Airflow.

Задание 1: Расширение структуры таблицы

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Добавьте в таблицу students_sample новые поля: email, phone, registration_date
  • Модифицируйте SQL запросы для работы с новой структурой
  • Добавьте задачу для обновления существующих записей

Цель задания: Научиться работать с миграциями схемы базы данных.

Задание 2: Создание отчетов

Сложность: 🟡 Средняя Время выполнения: 25-30 минут

Задача:

  • Добавьте задачу, которая создает сводный отчет по данным студентов
  • Отчет должен содержать: количество студентов, средний возраст, распределение по возрасту
  • Сохраните отчет в файл в папке /opt/airflow/data/output/

Цель задания: Освоить создание аналитических отчетов в DAG'ах.

Задание 3: Работа с соединениями

Сложность: 🟡 Средняя Время выполнения: 15-20 минут

Задача:

  • Создайте новое соединение к базе данных через Airflow UI
  • Модифицируйте DAG для использования нового соединения
  • Добавьте обработку ошибок подключения к БД

Цель задания: Научиться управлять соединениями с внешними системами.


📁 Задания для file_operations_dag.py

Цель: Освоить работу с файлами и данными в Airflow.

Задание 1: Модификация генерации данных

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Добавьте новые поля в генерируемые данные: department, experience_years, education_level
  • Модифицируйте валидацию для проверки новых полей
  • Добавьте фильтрацию данных по определенным критериям (например, опыт > 3 года)

Цель задания: Научиться работать с различными типами данных и валидацией.

Задание 2: Создание дополнительных отчетов

Сложность: 🟡 Средняя Время выполнения: 25-30 минут

Задача:

  • Создайте отчет в формате JSON с детальной статистикой по отделам
  • Добавьте визуализацию данных с помощью библиотеки matplotlib (сохранение графика в файл)
  • Создайте сводку по зарплатам в разных возрастных категориях

Цель задания: Освоить создание комплексных отчетов и визуализацию.

Задание 3: Оптимизация обработки

Сложность: 🟠 Продвинутая Время выполнения: 30-35 минут

Задача:

  • Разделите обработку данных на параллельные задачи для разных отделов
  • Добавьте контроль качества данных (проверка на дубликаты, аномалии)
  • Реализуйте механизм повторной обработки при ошибках

Цель задания: Научиться оптимизировать и делать обработку данных отказоустойчивой.


🐘 Задания для csv_to_postgres.py

Цель: Освоить паттерны загрузки данных (ETL) из файлов в базу данных и применение XCom.

Задание 1: Расширение структуры данных

Сложность: 🟢 Начальная Время выполнения: 15-20 минут

Задача:

  • Добавьте в генератор CSV новую колонку status (например, со случайными значениями 'NEW', 'PROCESSING', 'COMPLETED').
  • Обновите функцию _create_table, чтобы учесть новую колонку.
  • Запустите DAG и проверьте, что данные успешно загрузились с новой колонкой.

Цель задания: Понять процесс изменения схемы данных на всех этапах пайплайна.

Задание 2: Использование PostgresOperator

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Перепишите задачу create_orders_table. Сейчас она использует PythonOperator и PostgresHook внутри Python-функции.
  • Замените её на использование стандартного PostgresOperator, используя заранее созданный Connection.
  • Убедитесь, что пайплайн продолжает работать корректно.

Цель задания: Научиться использовать специализированные операторы для работы с БД вместо кастомного Python-кода.


🛡️ Задания для csv_to_postgres_dq.py

Цель: Освоить подходы к обеспечению качества данных (Data Quality) в Airflow.

Задание 1: Новая проверка качества

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Добавьте новую функцию проверки прямо в csv_to_postgres_dq.py, которая будет убеждаться, что все значения в колонке amount строго больше нуля.
  • Добавьте вызов этой функции как новую задачу в DAG csv_to_postgres_dq.
  • Встройте новую задачу в общую цепочку выполнения (например, перед dq_summary).

Цель задания: Научиться расширять набор проверок качества данных.

Задание 2: Управление статусом при ошибках (Trigger Rules)

Сложность: 🟠 Продвинутая Время выполнения: 25-30 минут

Задача:

  • Смоделируйте ошибку (например, временно измените данные так, чтобы проверки не прошли).
  • По умолчанию, если падает одна проверка, следующие не выполняются (поведение all_success).
  • Измените параметры задач так (с помощью trigger_rule), чтобы выполнялись все проверки, даже если некоторые из них упали.
  • Сделайте так, чтобы задача dq_summary могла анализировать статусы предыдущих задач и отражать общий итог.

Цель задания: Освоить продвинутую маршрутизацию статусов задач с помощью trigger_rule.


🔄 Задания для data_processing_dag.py

Цель: Освоить ETL процессы и работу с бизнес-логикой.

Задание 1: Расширение ETL пайплайна

Сложность: 🟡 Средняя Время выполнения: 30-35 минут

Задача:

  • Добавьте новый источник данных - файл с информацией о продуктах
  • Создайте задачу для объединения данных о заказах с информацией о продуктах
  • Добавьте расчет общей выручки по продуктам

Цель задания: Научиться работать с множественными источниками данных.

Задание 2: Создание дашборда

Сложность: 🟠 Продвинутая Время выполнения: 35-40 минут

Задача:

  • Создайте HTML-отчет с ключевыми метриками бизнеса
  • Добавьте графики продаж по дням и продуктам
  • Реализуйте отправку отчета по email (симуляция)

Цель задания: Освоить создание бизнес-отчетов и дашбордов.

Задание 3: Мониторинг качества данных

Сложность: 🟠 Продвинутая Время выполнения: 25-30 минут

Задача:

  • Добавьте проверки качества данных на каждом этапе ETL
  • Создайте механизм оповещения о проблемах с данными
  • Реализуйте архивирование обработанных данных

Цель задания: Научиться обеспечивать качество данных в ETL процессах.


🌿 Задания для branching_dag.py

Цель: Освоить условную логику и ветвление в Airflow.

Задание 1: Модификация условий ветвления

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Измените условие в функции check_data_quality() на основе реальных критериев (например, размер файла)
  • Добавьте третью ветку обработки для данных "требующих ручной проверки"
  • Настройте разные триггерные правила для слияния веток

Цель задания: Научиться создавать сложные условия ветвления.

Задание 2: Реализация реального сценария

Сложность: 🟠 Продвинутая Время выполнения: 30-35 минут

Задача:

  • Создайте реальные задачи обработки для CSV и JSON форматов
  • Добавьте валидацию данных в каждой ветке
  • Реализуйте механизм сравнения результатов из разных веток

Цель задания: Применить ветвление в реальном сценарии обработки данных.

Задание 3: Динамическое ветвление

Сложность: 🟠 Продвинутая Время выполнения: 25-30 минут

Задача:

  • Реализуйте ветвление на основе внешних параметров (например, переданных через Variables)
  • Добавьте обработку случая, когда ни одна ветка не подходит
  • Создайте механизм логирования выбранного пути выполнения

Цель задания: Освоить динамическое принятие решений в DAG'ах.


⚠️ Задания для error_handling_dag.py

Цель: Освоить обработку ошибок и создание отказоустойчивых пайплайнов.

Задание 1: Настройка стратегий повторения

Сложность: 🟡 Средняя Время выполнения: 20-25 минут

Задача:

  • Измените параметры retries и retry_delay для разных задач
  • Добавьте экспоненциальную задержку между повторными попытками
  • Реализуйте кастомный обработчик ошибок для конкретных исключений

Цель задания: Научиться настраивать стратегии обработки ошибок.

Задание 2: Создание комплексной обработки ошибок

Сложность: 🟠 Продвинутая Время выполнения: 30-35 минут

Задача:

  • Добавьте задачи для разных типов ошибок (сетевая ошибка, ошибка данных, системная ошибка)
  • Создайте механизм эскалации ошибок (после N неудачных попыток)
  • Реализуйте отправку уведомлений о критических ошибках

Цель задания: Освоить создание комплексной системы обработки ошибок.

Задание 3: Мониторинг и логирование

Сложность: 🟠 Продвинутая Время выполнения: 25-30 минут

Задача:

  • Добавьте детальное логирование всех этапов выполнения
  • Создайте задачу для анализа логов и генерации отчетов об ошибках
  • Реализуйте механизм автоматического восстановления после сбоев

Цель задания: Научиться создавать системы мониторинга и отладки.


🌟 Дополнительные задания: пулы, XCom, TaskGroup и алертинг

Цель: Освоить продвинутые возможности оркестрации — управление ресурсами, обмен данными между задачами, группировку и оповещения.

Задание 1: Пулы и управление ресурсами

Сложность: 🟡 Средняя
Время выполнения: 20-25 минут

Задача:

  • В интерфейсе Airflow создайте пул backup_pool с 2 слотами
  • Создайте новый DAG advanced_features_dag.py или расширьте data_processing_dag.py задачами резервного копирования (например, backup_to_csv, backup_to_db)
  • Назначьте этим задачам параметр pool="backup_pool" и настройте pool_slots так, чтобы одна из задач занимала 2 слота, а другая — 1
  • Наблюдайте в UI, что одновременно запускается не более 2 задач из этого пула

Цель задания: Научиться управлять параллелизмом задач через пулы и pool_slots.

Задание 2: Обмен данными через XCom

Сложность: 🟡 Средняя
Время выполнения: 20-25 минут

Задача:

  • В том же DAG добавьте задачу calculate_metrics (PythonOperator), которая возвращает словарь с агрегированными показателями, например: {"total_orders": ..., "avg_amount": ...}
  • Добавьте задачу log_metrics, которая с помощью xcom_pull читает результат calculate_metrics и выводит значения в лог
  • Для одной из задач продемонстрируйте использование XCom в Jinja-шаблоне (например, в bash_command или SQL-запросе)

Цель задания: Освоить передачу результатов между задачами через XCom и их использование в шаблонах.

Задание 3: TaskGroup и алертинг

Сложность: 🟠 Продвинутая
Время выполнения: 30-35 минут

Задача:

  • Объедините логически связанные задачи (например, extract / transform / load) в TaskGroup
  • Добавьте завершающую задачу send_notification на основе примера из раздела про алертинг (PythonOperator с send_email_smtp или другим механизмом уведомлений)
  • Настройте для задачи уведомления trigger_rule=TriggerRule.ALL_DONE, чтобы уведомление отправлялось даже при частичных ошибках
  • При желании вынесите функцию отправки письма в отдельный модуль utils.py и импортируйте её в DAG

Цель задания: Научиться группировать задачи с помощью TaskGroup и строить схему оповещений о статусе пайплайна.


🎯 Рекомендации по выполнению

  1. Начинайте с простых заданий и постепенно переходите к сложным
  2. Тестируйте каждое изменение через интерфейс Airflow
  3. Изучайте логи выполнения для понимания поведения задач
  4. Экспериментируйте с разными настройками и параметрами
  5. Документируйте свои решения и находки

📊 Оценка прогресса

  • 🟢 Начальный уровень: Выполнены задания для hello_world_dag и sql_basic_dag
  • 🟡 Средний уровень: Выполнены задания для file_operations_dag, csv_to_postgres.py, csv_to_postgres_dq.py и data_processing_dag
  • 🟠 Продвинутый уровень: Выполнены все задания, включая branching_dag, error_handling_dag и дополнительные задания по пулам, XCom, TaskGroup и алертингу Удачи в изучении Apache Airflow! 🚀