- Зачем: - сделать примеры более доступными для начинающих, убрав лишнюю архитектурную сложность (хелперы, внешние 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.
22 KiB
Учебные задания по Apache Airflow
Этот документ содержит практические задания для закрепления знаний по Apache Airflow. Каждое задание соответствует одному из учебных DAG'ов и направлено на лучшее понимание конкретных концепций.
📋 Общие инструкции
Перед выполнением заданий:
- Убедитесь, что стенд Airflow запущен:
docker-compose up -d - Проверьте доступность интерфейса: http://localhost:8080
- Ознакомьтесь с соответствующим 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 и строить схему оповещений о статусе пайплайна.
🎯 Рекомендации по выполнению
- Начинайте с простых заданий и постепенно переходите к сложным
- Тестируйте каждое изменение через интерфейс Airflow
- Изучайте логи выполнения для понимания поведения задач
- Экспериментируйте с разными настройками и параметрами
- Документируйте свои решения и находки
📊 Оценка прогресса
- 🟢 Начальный уровень: Выполнены задания для 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! 🚀