Содержание
- Архитектура и Экосистема Prefect
- Принцип работы: Flows и Tasks
- Prefect против Apache Airflow: Битва Кода
- Вариант 1: Apache Airflow
- Вариант 2: Prefect
- Сценарии использования Prefect (Use Cases)
- Work Pools и Воркеры: Путь в продакшн
- Взаимодействие и Дополнительные возможности
- Практический туториал. Упаковка Flow в Docker
- Заключение
- Референсные ссылки:
Prefect — это современная система оркестрации потоков данных (workflow orchestration), позволяющая превратить обычный Python-код в надежный, наблюдаемый и устойчивый к сбоям конвейер. Если классические инструменты вроде Apache Airflow требуют изучения сложного DSL (предметно-ориентированного языка), то Prefect исповедует философию «просто пиши на Python».
Главная «фишка» Prefect — концепция Negative Engineering (Инженерия сбоев). Разработчики инструмента справедливо заметили, что инженер данных тратит лишь 10% времени на написание бизнес-логики (что именно код должен делать). Оставшиеся 90% уходят на борьбу с непредвиденным: «что делать, если API упал?», «как перезапустить задачу при потере сети?», «где хранить логи, если сервер сгорел?». Prefect берет эти 90% рутины на себя.
Таким образом, Prefect — это не просто планировщик задач. Это страховой полис для вашего кода, гарантирующий, что пайплайн либо выполнится успешно, либо вы точно узнаете, почему и где он сломался.
Архитектура и Экосистема Prefect
Архитектура Prefect радикально отличается от монолитных предшественников. Она построена на принципе гибридного исполнения (Hybrid Execution Model). Это решение разделяет вашу инфраструктуру и управляющий слой, обеспечивая безопасность и гибкость.
Система состоит из трех ключевых компонентов:
- Prefect Server (или Cloud). Это «мозг» системы. Он хранит метаданные о задачах, историю запусков, конфигурации расписаний и пользовательский интерфейс (UI). Важно отметить, что Server никогда не видит ваш исходный код и не имеет доступа к вашим данным. Он знает только «что» запускать и «каков статус».
- Workers (Воркеры). Это «руки» системы. Легковесные процессы, которые запускаются в вашей защищенной инфраструктуре (на локальном ноутбуке, в Kubernetes, в Docker-контейнере или на VM в облаке). Воркер опрашивает Сервер на наличие новых задач и выполняет их.
- Artifacts & Storage. Место, где физически лежит ваш код (GitHub, S3, Docker Registry). Воркер забирает код оттуда перед выполнением.
Такой подход решает главную проблему безопасности. Ваши данные (пароли к БД, чувствительная информация клиентов) никогда не покидают ваш периметр. Облачный или локальный сервер оркестрации получает лишь сигналы светофора: «Готово», «Ошибка», «Запущено».
Принцип работы: Flows и Tasks
В основе работы Prefect лежат два примитива, знакомых любому Python-разработчику: функции. Чтобы подключить Prefect, вам не нужно переписывать приложение с нуля. Достаточно добавить специальные декораторы.
Ключевые сущности:
- Task (Задача) — наименьшая единица работы. Функция, обернутая декоратором @task. Она выполняет конкретное действие: скачивает файл, чистит строку, делает запрос к базе. Задачи могут автоматически перезапускаться при сбоях (retries) и кэшировать результаты.
- Flow (Поток) — контейнер для задач. Функция с декоратором @flow. Она описывает логику взаимодействия задач: порядок выполнения, передачу данных и обработку условий. Flow — это и есть ваш DAG (направленный ациклический граф), только строится он динамически.
Различие между ними фундаментально. Flow управляет состоянием и структурой, а Task делает «грязную работу». Если Flow падает, Prefect знает, на каком шаге это случилось, и при перезапуске может (при правильной настройке) не выполнять уже успешные задачи повторно.
Этот подход делает код чистым. Вы пишете обычные вызовы функций, а Prefect «под капотом» строит граф зависимостей, отслеживает время выполнения и ловит исключения.
Prefect против Apache Airflow: Битва Кода
Многие инженеры приходят к Prefect, устав от громоздкости Apache Airflow. Чтобы понять разницу, недостаточно сравнить списки функций. Нужно посмотреть на код.
Главное концептуальное отличие: Airflow статичен, Prefect динамичен. В Airflow вы описываете граф, который компилируется планировщиком. В Prefect вы запускаете код, и граф строится в процессе выполнения.
Сравним реализацию простейшего ETL-процесса: скачать данные -> обработать -> сохранить.
Вариант 1: Apache Airflow
В Airflow нам нужно импортировать операторы, создавать объект DAG, следить за контекстом и использовать специальный синтаксис битовых сдвигов (>>) для зависимостей. Передача данных между задачами (XCom) неявная и неудобная.
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
def extract():
return [1, 2, 3]
def transform(ti):
# Приходится "вытягивать" данные через XCom
data = ti.xcom_pull(task_ids='extract_task')
return [x * 10 for x in data]
def load(ti):
data = ti.xcom_pull(task_ids='transform_task')
print(f"Loading {data}")
with DAG('etl_dag', start_date=datetime(2023, 1, 1), schedule='@daily') as dag:
t1 = PythonOperator(
task_id='extract_task',
python_callable=extract
)
t2 = PythonOperator(
task_id='transform_task',
python_callable=transform
)
t3 = PythonOperator(
task_id='load_task',
python_callable=load
)
t1 >> t2 >> t3 # Явное задание зависимостей
Apache Airflow для инженеров данных
Код курса
AIRF
Ближайшая дата курса
2 марта, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800
Вариант 2: Prefect
В Prefect код выглядит как обычный скрипт. Зависимости определяются тем, что одна задача принимает результат другой. Никаких XCom, никаких >>.
from prefect import flow, task
@task
def extract():
return [1, 2, 3]
@task
def transform(data):
# Данные передаются как обычные аргументы
return [x * 10 for x in data]
@task
def load(data):
print(f"Loading {data}")
@flow(name="simple-etl")
def etl_flow():
# Обычный императивный стиль
raw_data = extract()
clean_data = transform(raw_data)
load(clean_data)
if __name__ == "__main__":
etl_flow()
Вывод по коду:
Prefect снижает когнитивную нагрузку. Вы не думаете о том, как «угодить» оркестратору. Вы думаете о бизнес-логике. В Airflow изменение логики часто требует переписывания структуры DAG. В Prefect — это просто изменение вызова функции.
Сценарии использования Prefect (Use Cases)
Гибкость Prefect позволяет использовать его в самых разных областях работы с данными.
Во-первых, это классические ETL/ELT процессы. Prefect идеально подходит для построения хранилищ данных (DWH). Благодаря нативной поддержке асинхронности (async/await), он может эффективно оркестрировать сотни параллельных загрузок из API, не блокируя ресурсы.
Во-вторых, MLOps и обучение моделей. Это зона, где Prefect сияет ярче всего. ML-пайплайны часто требуют динамики: «если точность модели ниже X, запусти переобучение с новыми параметрами». В Airflow реализовать ветвление сложно (BranchPythonOperator). В Prefect это обычный if/else внутри функции @flow.
В-третьих, автоматизация инфраструктуры. Проверки качества данных, регулярные отчеты, чистка временных таблиц. Prefect позволяет легко обернуть любой Python-скрипт в управляемый процесс с логами и уведомлениями в Slack или Telegram при ошибках.
Work Pools и Воркеры: Путь в продакшн
Запустить @flow локально просто. Но как заставить его работать по расписанию на удаленном сервере? Здесь в игру вступают Work Pools (Пулы работ) и Workers.
Схема развертывания выглядит так:
- Deployment (Развертывание): Вы «пакуете» ваш Flow. Это создает запись на сервере Prefect: «У нас есть такой-то Flow, он должен запускаться раз в час, код лежит на GitHub, параметры такие-то».
- Work Queue (Очередь): Развертывание привязывается к определенному Work Pool (например, prod-gpu-pool или light-cpu-pool). Запланированные запуски попадают в очередь этого пула.
- Worker (Воркер): Это процесс, запущенный на вашем сервере. Он подписан на конкретный Work Pool. Как только в очереди появляется задача, Воркер «подхватывает» её, скачивает свежий код и запускает.
Эта модель Pull (вытягивания) критически важна. Сервер не стучится к вам (что потребовало бы открытых портов и настройки firewall). Именно ваш Воркер стучится на сервер за задачами. Это упрощает настройку безопасности в корпоративных сетях.
Взаимодействие и Дополнительные возможности
Помимо базового запуска, Prefect предоставляет мощные инструменты для контроля качества.
- Кэширование (Caching)
Устали пересчитывать тяжелые датафреймы при каждой ошибке в конце пайплайна? Добавьте параметры кэша:
@task(cache_key_fn=task_input_hash, cache_expiration=timedelta(hours=1))
Если входные данные не изменились, Prefect мгновенно вернет старый результат, сэкономив часы вычислений. - Параллелизм (Concurrency)
Prefect поддерживает TaskRunners. Вы можете переключить выполнение задач с последовательного на параллельное (используя Dask или Ray), просто изменив одну строчку в конфигурации. Код самих задач менять не нужно. - Блоки (Blocks)
Это безопасный способ хранения конфигураций. Вместо того чтобы хардкодить креды от AWS или путь к базе данных в коде, вы создаете «Блок» в UI Prefect. В коде вы просто вызываете:
s3_block = S3Bucket.load(«my-prod-bucket»)
Это делает смену паролей или путей тривиальной задачей, не требующей деплоя кода.
Практический туториал. Упаковка Flow в Docker
Запуск скрипта локально — это хорошо, но в продакшене код живет в контейнерах. Это гарантирует, что ваш пайплайн сработает одинаково и на ноутбуке разработчика, и на сервере. Давайте упакуем наш simple-etl пайплайн в Docker. Нам понадобятся всего три файла.
- Подготовка файлов. Создайте папку prefect-docker-demo и положите туда flow.py (наш код пайплайна)
- Создайте файл зависимостей requirements.txt
prefect>=2.0
- Dockerfile с инструкциями по сборке
# Используем официальный легкий образ Python FROM python:3.9-slim # Задаем рабочую директорию внутри контейнера WORKDIR /app # Сначала копируем зависимости (для кэширования слоев Docker) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Копируем сам код пайплайна COPY flow.py . # Команда, которая выполнится при старте контейнера CMD ["python", "flow.py"]
- Запускаем сборку образа контейнера my-prefect-flow
docker build -t my-prefect-flow .
- Запускаем контейнер локально или с подключением через PrefectCloudAPI для мониторинга
docker run my-prefect-flow . #--- или docker run \ -e PREFECT_API_URL="https://api.prefect.cloud/..." \ -e PREFECT_API_KEY="pnu_..." \ my-prefect-flow
Apache Airflow для инженеров данных
Код курса
AIRF
Ближайшая дата курса
2 марта, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800
Заключение
Prefect — это выбор прагматичного инженера данных. Он снимает необходимость бороться с инструментом и позволяет сосредоточиться на коде.
Если ваш проект требует жесткой статической структуры и у вас уже есть команда экспертов по Airflow, миграция может быть нецелесообразна. Однако для новых проектов, ML-задач и команд, ценящих скорость разработки (Time-to-Market), Prefect сегодня является стандартом де-факто в мире современного Python Data Engineering. Он превращает хаос скриптов в упорядоченную, наблюдаемую систему.
Референсные ссылки:
- [Pref Documentation: Concepts & Architecture] (https://docs.prefect.io/)
- [The Perfect Way: Negative Engineering] (https://www.prefect.io/blog/negative-engineering)
- [Airflow vs PREF: Top Differences] (https://towardsdatascience.com/airflow-vs-prefect-2024-comparison)





