- Зачем: - необходимо отразить в документации новый пайплайн загрузки CSV в PostgreSQL. - студентам нужны конкретные задания для закрепления навыков ETL и Data Quality. - Что: - обновлен README.md: добавлено описание новых DAG-ов, папок sql/ и tests/, актуализирован путь обучения. - обновлен educational-tasks.md: добавлены 4 новых задания (ETL, PostgresOperator, DQ проверки, Trigger Rules) и обновлен блок оценки прогресса. - Проверка: - визуальная проверка файлов README.md и educational-tasks.md в репозитории.
360 lines
22 KiB
Markdown
360 lines
22 KiB
Markdown
# Учебные задания по 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` и прямое подключение через `psycopg2`.
|
||
- Замените её на использование стандартного `PostgresOperator`, используя заранее созданный Connection.
|
||
- Убедитесь, что пайплайн продолжает работать корректно.
|
||
|
||
**Цель задания:** Научиться использовать специализированные операторы для работы с БД вместо кастомного Python-кода.
|
||
|
||
---
|
||
|
||
## 🛡️ Задания для csv_to_postgres_dq.py
|
||
|
||
**Цель:** Освоить подходы к обеспечению качества данных (Data Quality) в Airflow.
|
||
|
||
### Задание 1: Новая проверка качества
|
||
**Сложность:** 🟡 Средняя
|
||
**Время выполнения:** 20-25 минут
|
||
|
||
**Задача:**
|
||
- Добавьте новую функцию проверки в `helpers/postgres.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! 🚀
|