fix(dags): сделать учебные сценарии воспроизводимыми

Управляемые ветки и ошибки, зависимости общих обработчиков, сохранение SQL-результата и фактическое чтение результатов Extract. Добавлен пример пулов и XCom; DQ-сводка сохраняет отказ при all_done.

Проверено на Airflow 2.9.2: импорт и запуск девяти исходных DAG, выбор веток, повтор и окончательные отказы обеих рабочих задач, отрицательный DQ-сценарий и восстановление, фильтрация Extract и ожидание слотов.
This commit is contained in:
ddadmin committed 2026-09-28 08:46:50 -04:00
1 parent 623d5861c1
commit cf1b770a65
6 files changed
+225 -211

No files matched your search

+8 -9
View File
@@ -6,7 +6,7 @@ DAG для демонстрации ETL процессов в Airflow
1. Создание тестовых данных (клиенты + заказы) в CSV
2. Параллельное извлечение (Extract) клиентов и заказов
3. Трансформация (Transform) — объединение таблиц, вычисляемые поля
4. Загрузка (Load) — подготовка SQL для вставки в БД
4. Имитация загрузки: число подготовленных строк и пример DDL в логах
5. Генерация текстового отчёта со статистикой
Результат: файлы в /opt/airflow/data/output/ (extracted_*, transformed_data.csv, report.txt).
@@ -14,7 +14,6 @@ DAG для демонстрации ETL процессов в Airflow
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.postgres.operators.postgres import PostgresOperator
# Определение DAG
default_args = {
@@ -85,8 +84,8 @@ def extract_orders():
def transform_data():
"""Преобразование данных - объединение клиентов и заказов"""
import pandas as pd
customers_df = pd.read_csv('/opt/airflow/data/input/customers.csv')
orders_df = pd.read_csv('/opt/airflow/data/input/orders.csv')
customers_df = pd.read_csv('/opt/airflow/data/output/extracted_customers.csv')
orders_df = pd.read_csv('/opt/airflow/data/output/extracted_orders.csv')
# Объединяем данные
merged_df = pd.merge(orders_df, customers_df, on='customer_id', how='left')
@@ -101,14 +100,14 @@ def transform_data():
return f"Преобразованы {len(merged_df)} записей"
def load_to_database():
def simulate_load():
"""Загрузка данных в базу данных (симуляция)"""
import pandas as pd
df = pd.read_csv('/opt/airflow/data/output/transformed_data.csv')
# В реальном сценарии здесь был бы код для загрузки в базу данных
# Для учебных целей просто логируем
print(f"Загружено в базу данных: {len(df)} записей")
print(f"Имитация загрузки: подготовлено {len(df)} записей. Записи в БД нет.")
# Создаем SQL для создания таблицы (в реальном сценарии)
create_table_sql = """
@@ -185,8 +184,8 @@ transform_task = PythonOperator(
)
load_task = PythonOperator(
task_id='load_to_database',
python_callable=load_to_database,
task_id='simulate_load',
python_callable=simulate_load,
dag=dag
)
@@ -197,4 +196,4 @@ report_task = PythonOperator(
)
# Установка зависимостей
create_data_task >> [extract_customers_task, extract_orders_task] >> transform_task >> load_task >> report_task
create_data_task >> [extract_customers_task, extract_orders_task] >> transform_task >> load_task >> report_task