Раздел 26 · Data Engineering

DAG, задачи и операторы

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы увидели файл пайплайна «Гонца» целиком, но без объяснений. Там были DAG, @task и стрелки >>. Сегодня разберёмся, из чего Airflow собирает пайплайн и как шаги передают друг другу данные. Заодно пайплайн подрастёт: Отто попросил добавить в отчёт курьеров, а их удобно выгружать параллельно с заказами.

План ремонта

Ремонт квартиры состоит из работ. Нельзя красить стены, пока их не оштукатурили. Нельзя класть плитку в ванной, пока не провели трубы. А электрика и сантехника друг от друга не зависят, их можно делать одновременно двумя бригадами.

Если нарисовать работы кружками, а «после чего» стрелками, получится схема, по которой прораб каждое утро решает, кому что делать. В ней есть одно правило: стрелки не могут образовать круг. Если покраска после штукатурки, а штукатурка после покраски, ремонт никогда не начнётся.

Такая схема и есть DAG.

DAG

DAG расшифровывается как directed acyclic graph, направленный ациклический граф. Разберём по словам:

  • граф: задачи и связи между ними;
  • направленный: у каждой связи есть «до» и «после», чистка идёт после выгрузки, а не наоборот;
  • ациклический: нельзя вернуться в задачу, с которой начал. Иначе пайплайн не знал бы, с чего начать.

В Airflow DAG это весь пайплайн: какие в нём шаги, в каком порядке и по какому расписанию. Один файл на Python может описать один или несколько DAG.

Задачи и операторы

Задача это один шаг DAG с именем task_id. Выгрузка заказов, чистка, загрузка, проверка: всё это задачи.

Оператор это шаблон: какую работу задача умеет делать. PythonOperator вызывает функцию на Python, BashOperator выполняет команду в терминале, EmptyOperator ничего не делает и служит точкой сбора. Задача это оператор с конкретными настройками и своим task_id.

Вот одна и та же задача, написанная двумя способами:

from airflow.providers.standard.operators.python import PythonOperator

def extract_orders():
    ...

PythonOperator(task_id="extract_orders", python_callable=extract_orders)
from airflow.sdk import task

@task
def extract_orders():
    ...

extract_orders()

Второй способ называется TaskFlow. Декоратор @task превращает функцию в задачу, а вызов функции внутри DAG добавляет задачу в граф. Имя задачи берётся из имени функции. Для задач на Python TaskFlow короче, им и будем пользоваться. Операторы понадобятся, когда работа не на Python: SQL в хранилище, команда в терминале, файл в S3.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.