# Учебные задания по 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 минут **Задача:** - Разделите обработку данных на параллельные задачи для разных отделов - Добавьте контроль качества данных (проверка на дубликаты, аномалии) - Реализуйте механизм повторной обработки при ошибках **Цель задания:** Научиться оптимизировать и делать обработку данных отказоустойчивой. --- ## 🔄 Задания для 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 и data_processing_dag - 🟠 **Продвинутый уровень:** Выполнены все задания, включая branching_dag, error_handling_dag и дополнительные задания по пулам, XCom, TaskGroup и алертингу Удачи в изучении Apache Airflow! 🚀