🎯 Definicja

Skierowany Graf Acykliczny (DAG, ang. Directed Acyclic Graph) to struktura danych składająca się z zestawu wierzchołków (węzłów) i skierowanych krawędzi między nimi, przy czym graf nie zawiera żadnych cykli — nie da się wrócić do punktu wyjścia przez serię połączeń. DAG umożliwia jednoznaczne uporządkowanie zadań lub zależności w przetwarzaniu danych, co czyni go idealnym do modelowania potoków danych i procesów transformacji.

🔑 Kluczowe punkty

  • Skierowany: każda krawędź ma kierunek (od węzła rodzica do dziecka).
  • Acykliczny: brak możliwości utworzenia pętli — nie można wrócić do tego samego węzła.
  • Kolejność zależności: Graf wyraża zależności między krokami procesu (np. ETL, transformacji danych).
  • Idempotencja i retry: dzięki strukturze DAG, możliwe jest bezpieczne ponowne uruchamianie tylko wybranych fragmentów procesu.
  • Zastosowanie w Data Engineeringu — orkiestracja, lineage, obserwowalność.

📚 Szczegółowe wyjaśnienie

Zastosowanie DAG w inżynierii danych

W systemach takich jak Apache Airflow, Dagster, Prefect czy dbt, DAG reprezentuje potok przetwarzania danych:

  • Węzeł (node): oznacza krok w potoku (np. ekstrakcję, transformację, agregację).
  • Krawędź (edge): reprezentuje zależność — jeden krok musi zakończyć się sukcesem, by drugi mógł się rozpocząć.
  • Flow danych: DAG pozwala ustalić, które zadania można uruchomić równolegle, a które muszą nastąpić po sobie.

Cechy funkcjonalne DAG

  • Deterministyczność: przy tych samych danych wejściowych – te same wyniki.
  • Idempotencja: każdy krok może być bezpiecznie uruchomiony wielokrotnie – patrz: Idempotentność.
  • Debuggowanie i retry: w przypadku błędu można powtórzyć tylko problematyczny krok, a nie cały potok.
  • Rozszerzalność: łatwo dodawać nowe węzły i zależności bez przebudowy całego workflow.

Przykładowe narzędzia wykorzystujące DAG

NarzędzieOpis
Apache AirflowPlanowanie i zarządzanie złożonymi pipeline’ami danych
DagsterPodejście typu “data asset-oriented” z deklaratywnym API
dbtModelowanie danych w SQL jako DAG transformacji
PrefectNowoczesna orkiestracja z retry, caching, task runnerami

Przykład graficzny DAG

Przykładowy DAG potoku danych:

raw_data_ingest
       ↓
transform_clean_data
       ↓
aggregate_to_metrics
       ↓
publish_to_dashboard

Każdy z tych kroków jest od siebie zależny i może zostać uruchomiony tylko wtedy, gdy jego poprzednik zakończy się pomyślnie.

💡 Przykład zastosowania

W architekturze danych e-commerce, zespół buduje pipeline oparty o Apache Airflow, w którym:

  • Task A: pobiera dane zamówień z API (extract_orders)
  • Task B: oczyszcza dane (clean_orders)
  • Task C: agreguje dane dzienne (agg_daily_orders)
  • Task D: publikuje dane do Tableau (update_dashboard)

Wszystkie kroki są modelowane jako DAG. Jeśli podczas agregacji (Task C) wystąpi błąd, można ponownie uruchomić tylko ten krok — nie trzeba uruchamiać ekstrakcji ani integracji z Tableau. Struktura DAG pozwala również na analizę pochodzenia danych (data lineage) i automatyczne planowanie przetwarzania (np. codzienna aktualizacja).

📌 Źródła

👽 Brudnopis

  • DAG: Directed → każde połączenie ma kierunek
  • Acykliczny → brak cykli, nie ma pętli
  • DAG ≠ drzewo — mogą być wierzchołki z wieloma parentami
  • Istotne w przetwarzaniu danych, BI, orkiestracji
  • Struktura bazowa np. w dbt: każdy model SQL to węzeł DAG
  • Retry, flow control, impact analysis, parallelism → wszystko dostępne dzięki DAG
  • DAG = mapowanie zależności logicznych między taskami – nie wykres ładowania danych