← Назад к вопросам

Что такое DAG?

1.2 Junior🔥 151 комментариев
#MLOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

DAG: Направленный ациклический граф

DAG (Directed Acyclic Graph — Направленный ациклический граф) — это фундаментальная структура данных и концепция в computer science, которая нашла широкое применение в data engineering, особенно в орхестрации рабочих потоков.

Определение

DAG — это граф, где:

  • Направленность (Directed): рёбра имеют направление (от одного узла к другому)
  • Ациклический (Acyclic): нет циклов — невозможно начать с какого-либо узла и вернуться в него, следуя рёбрам
  • Узлы (Nodes): представляют задачи (tasks) или операции
  • Рёбра (Edges): показывают зависимости между задачами

Примеры DAG:

Задача A → Задача B → Задача D
     ↓           ↓
Задача C -------→↓

Задача D зависит от B и C, B зависит от A и C, C независима от остальных на начальном этапе.

Применение в Data Engineering

1. Orchester рабочих потоков (Workflow Orchestration)

DAG широко используется в инструментах для управления data pipelines:

Apache Airflow — самый популярный инструмент. Каждый workflow представлен как DAG:

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def extract_data():
    print("Извлечение данных из источника")

def transform_data():
    print("Трансформация данных")

def load_data():
    print("Загрузка данных в хранилище")

with DAG(
    'my_data_pipeline',
    start_date=datetime(2024, 1, 1),
    schedule_interval='@daily'
) as dag:
    
    extract_task = PythonOperator(
        task_id='extract',
        python_callable=extract_data
    )
    
    transform_task = PythonOperator(
        task_id='transform',
        python_callable=transform_data
    )
    
    load_task = PythonOperator(
        task_id='load',
        python_callable=load_data
    )
    
    # Определение зависимостей
    extract_task >> transform_task >> load_task

Оператор >> определяет направление потока данных: extract должен завершиться перед transform, а transform перед load.

2. Другие инструменты для DAG

  • Prefect: более модульный и flexible подход к workflow'ам
  • Dagster: ориентирован на data assets и lineage
  • Kubernetes: DAG'и представляют dependency chains в Job'ах
  • dbt (Data Build Tool): использует DAG для управления data transformations

Ключевые свойства DAG

Акциклічность

Отсутствие циклов критично для орхестрации:

  • Гарантирует, что workflow всегда завершится
  • Позволяет определить порядок выполнения задач
  • Предотвращает бесконечные зависимости

Если бы был цикл (A → B → C → A), система не знала бы, с какой задачи начать.

Параллелизм

DAG позволяет выявить задачи, которые можно выполнять параллельно:

    A
   / \
  B   C
   \ /
    D

Здесь B и C могут выполняться одновременно (у них нет зависимостей друг от друга), так как обе зависят только от A. D ждет завершения обеих.

Data Lineage (Родословная данных)

DAG позволяет отследить, откуда берутся данные и как они трансформируются:

Рaw Data (PostgreSQL)
    ↓
Extract Data
    ↓
Validate Quality
    ↓
Transform & Aggregate
    ↓
Load to Data Warehouse
    ↓
BI Reports

Это критично для:

  • Data Governance: понимание, где берутся данные
  • Impact Analysis: что изменится, если модифицировать источник
  • Debugging: быстрое выявление причины ошибки в пайплайне

Сложный пример с разветвлениями

from airflow.operators.python import BranchPythonOperator

def choose_branch():
    import random
    return 'task_a' if random.random() > 0.5 else 'task_b'

branch_task = BranchPythonOperator(
    task_id='branch',
    python_callable=choose_branch
)

task_a = PythonOperator(task_id='task_a', python_callable=lambda: None)
task_b = PythonOperator(task_id='task_b', python_callable=lambda: None)
task_final = PythonOperator(task_id='final', python_callable=lambda: None)

branch_task >> [task_a, task_b] >> task_final

Это создаёт DAG, где в зависимости от результата branch_task выполняется либо task_a, либо task_b, но обе сходятся на task_final.

Преимущества использования DAG

  1. Ясность: визуально понять логику workflow'а
  2. Масштабируемость: управлять сотнями задач
  3. Надежность: автоматические retries, обработка ошибок
  4. Мониторинг: отслеживание статуса каждой задачи
  5. Воспроизводимость: гарантированный порядок выполнения

DAG — это не просто теоретическая концепция, а практический инструмент, который делает data pipelines управляемыми, надежными и масштабируемыми.

Что такое DAG? | PrepBro