Что такое DAG в контексте Apache Airflow?

Ответ

DAG (Directed Acyclic Graph, направленный ациклический граф) — это фундаментальная концепция и структурная единица в Apache Airflow. Он определяет набор задач и их зависимостей, которые необходимо выполнить.

  • Directed (Направленный): Зависимости между задачами имеют направление (от одной задачи к другой).
  • Acyclic (Ациклический): Граф не должен содержать циклов. Задача не может зависеть от самой себя ни прямо, ни через другие задачи, что гарантирует конечность выполнения.

На практике DAG в Airflow — это Python-скрипт, который:

  1. Определяет сам граф (объект DAG) с расписанием (schedule_interval) и другими параметрами.
  2. Определяет задачи (операторы, Operators), такие как BashOperator, PythonOperator, PostgresOperator.
  3. Определяет зависимости между задачами с помощью операторов >> (set_downstream) и << (set_upstream).

Пример простого DAG:

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

def process_data():
    print("Обрабатываю данные...")

with DAG(
    dag_id='my_etl_dag',
    start_date=datetime(2023, 1, 1),
    schedule_interval='@daily'
) as dag:

    extract = BashOperator(
        task_id='extract_data',
        bash_command='echo "Extracting..."'
    )

    transform = PythonOperator(
        task_id='transform_data',
        python_callable=process_data
    )

    load = BashOperator(
        task_id='load_data',
        bash_command='echo "Loading..."'
    )

    # Определение зависимостей: extract -> transform -> load
    extract >> transform >> load

Почему DAG — идеальная модель для оркестрации:

  • Визуализация: Airflow UI отображает граф задач, что позволяет легко отслеживать прогресс и зависимости.
  • Управление зависимостями: Позволяет четко описывать, какие задачи могут выполняться параллельно, а какие — только после успешного завершения других.
  • Перезапуск с контрольной точки: При сбое можно перезапустить только неудавшиеся задачи и их зависимых потомков, а не весь пайплайн с начала.

Ответ 18+ 🔞

А, слушай, про DAG в Airflow! Это ж, бля, основа основ, без этого нихуя не работает. Представь себе такую штуку — DAG (Directed Acyclic Graph, направленный ациклический граф). Звучит сложно, но на деле это просто набор тасок и их зависимостей, которые надо выполнить по порядку, а не как попало.

  • Directed (Направленный): Это значит, что связи между задачами — не просто так, а имеют чёткое направление. Одна задача пнула другую, та побежала делать своё дело. Не наоборот.
  • Acyclic (Ациклический): А это, ёпта, самое важное — циклов быть не должно. То есть задача не может, блядь, зависеть от самой себя, даже через десять других. Иначе получится вечный двигатель, который будет крутиться до скончания времён, а у нас сервера дорогие. Терпения ноль ебать на такое.

По факту, DAG в Airflow — это обычный Python-скрипт, который делает три вещи:

  1. Создаёт сам граф (объект DAG) и говорит ему, когда стартовать (start_date) и как часто бухаться на работу (schedule_interval).
  2. Объявляет задачи — это операторы (Operators): BashOperator (чтобы командой башнуть), PythonOperator (чтобы питонячий код запустить), PostgresOperator и куча других.
  3. Расставляет между ними зависимости с помощью операторов >> (это типа "сделай сначала это, потом то") и <<.

Вот тебе простой пример, смотри:

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

def process_data():
    print("Обрабатываю данные...")

with DAG(
    dag_id='my_etl_dag',
    start_date=datetime(2023, 1, 1),
    schedule_interval='@daily'
) as dag:

    extract = BashOperator(
        task_id='extract_data',
        bash_command='echo "Extracting..."'
    )

    transform = PythonOperator(
        task_id='transform_data',
        python_callable=process_data
    )

    load = BashOperator(
        task_id='load_data',
        bash_command='echo "Loading..."'
    )

    # Определение зависимостей: extract -> transform -> load
    extract >> transform >> load

Видишь? Сначала extract (вытащить данные), потом transform (преобразовать), потом load (загрузить). Хуй с горы — логика проще некуда.

А почему эта модель — просто огонь для оркестрации?

  • Визуализация: В интерфейсе Airflow ты этот граф видишь как на ладони. Какая таска зелёная, какая красная, кто от кого зависит — всё понятно, ебать копать. Не надо в логах ковыряться как слепой крот.
  • Управление зависимостями: Ты чётко говоришь системе, что может делаться параллельно, а что должно ждать, пока предыдущая манда с ушами закончит своё чёрное дело.
  • Перезапуск с контрольной точки: Вот это вообще песня. Если что-то пошло по пизде, ты не перезапускаешь весь пайплайн с каменного века. Ты можешь перезапустить только упавшую задачу и те, что от неё зависели. Экономия времени и нервов — овердохуища.