fix(dags): сделать учебные сценарии воспроизводимыми
Управляемые ветки и ошибки, зависимости общих обработчиков, сохранение SQL-результата и фактическое чтение результатов Extract. Добавлен пример пулов и XCom; DQ-сводка сохраняет отказ при all_done. Проверено на Airflow 2.9.2: импорт и запуск девяти исходных DAG, выбор веток, повтор и окончательные отказы обеих рабочих задач, отрицательный DQ-сценарий и восстановление, фильтрация Extract и ожидание слотов.
This commit is contained in:
1 parent
623d5861c1
commit
cf1b770a65
6 files changed
+225
-211
No files matched your search
@@ -0,0 +1,61 @@
|
||||
"""Пулы и XCom на двух задачах с наблюдаемой длительностью.
|
||||
|
||||
До запуска создайте пул training_pool с двумя слотами.
|
||||
Чтение источников имитируется; подключений и входных файлов не требуется.
|
||||
"""
|
||||
import logging
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
from airflow import DAG
|
||||
from airflow.operators.python import PythonOperator
|
||||
|
||||
|
||||
def read_source(source, rows):
|
||||
"""Имитирует чтение источника в течение 20 секунд."""
|
||||
logging.info("Начало чтения %s", source)
|
||||
time.sleep(20)
|
||||
logging.info("Чтение %s завершено: %s строк (имитация)", source, rows)
|
||||
return rows
|
||||
|
||||
|
||||
def calculate_metrics(ti):
|
||||
"""Получает небольшие результаты двух задач через XCom."""
|
||||
customers = ti.xcom_pull(task_ids="read_customers")
|
||||
orders = ti.xcom_pull(task_ids="read_orders")
|
||||
return {"customers": customers, "orders": orders}
|
||||
|
||||
|
||||
def log_metrics(ti):
|
||||
"""Печатает словарь, возвращенный предыдущей задачей."""
|
||||
logging.info("Метрики: %s", ti.xcom_pull(task_ids="calculate_metrics"))
|
||||
|
||||
|
||||
with DAG(
|
||||
"resource_management_dag",
|
||||
start_date=datetime(2023, 1, 1),
|
||||
schedule=None,
|
||||
catchup=False,
|
||||
default_args={"owner": "student", "retries": 0},
|
||||
tags=["educational", "pools", "xcom"],
|
||||
) as dag:
|
||||
customers_task = PythonOperator(
|
||||
task_id="read_customers",
|
||||
python_callable=read_source,
|
||||
op_kwargs={"source": "customers", "rows": 20},
|
||||
pool="training_pool",
|
||||
pool_slots=2,
|
||||
)
|
||||
orders_task = PythonOperator(
|
||||
task_id="read_orders",
|
||||
python_callable=read_source,
|
||||
op_kwargs={"source": "orders", "rows": 30},
|
||||
pool="training_pool",
|
||||
pool_slots=1,
|
||||
)
|
||||
metrics_task = PythonOperator(
|
||||
task_id="calculate_metrics", python_callable=calculate_metrics,
|
||||
)
|
||||
log_task = PythonOperator(task_id="log_metrics", python_callable=log_metrics)
|
||||
|
||||
[customers_task, orders_task] >> metrics_task >> log_task
|
||||
Reference in new issue
Block a user