A B C D E F G H I K L M N O P R S T V W Y Z А Б В Е И К М О П Т Ц
Pa Pr Py

Prefect

Prefect

 

 

Prefect — это современная система оркестрации потоков данных (workflow orchestration), позволяющая превратить обычный Python-код в надежный, наблюдаемый и устойчивый к сбоям конвейер. Если классические инструменты вроде Apache Airflow требуют изучения сложного DSL (предметно-ориентированного языка), то Prefect исповедует философию «просто пиши на Python».

Главная «фишка» Prefect — концепция Negative Engineering (Инженерия сбоев). Разработчики инструмента справедливо заметили, что инженер данных тратит лишь 10% времени на написание бизнес-логики (что именно код должен делать). Оставшиеся 90% уходят на борьбу с непредвиденным: «что делать, если API упал?», «как перезапустить задачу при потере сети?», «где хранить логи, если сервер сгорел?». Prefect берет эти 90% рутины на себя.

Таким образом, Prefect — это не просто планировщик задач. Это страховой полис для вашего кода, гарантирующий, что пайплайн либо выполнится успешно, либо вы точно узнаете, почему и где он сломался.

 

Архитектура и Экосистема Prefect

 

Архитектура Prefect радикально отличается от монолитных предшественников. Она построена на принципе гибридного исполнения (Hybrid Execution Model). Это решение разделяет вашу инфраструктуру и управляющий слой, обеспечивая безопасность и гибкость.

Система состоит из трех ключевых компонентов:

 

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 и flow в Prefect

 

  • Task (Задача) — наименьшая единица работы. Функция, обернутая декоратором @task. Она выполняет конкретное действие: скачивает файл, чистит строку, делает запрос к базе. Задачи могут автоматически перезапускаться при сбоях (retries) и кэшировать результаты.
  • Flow (Поток) — контейнер для задач. Функция с декоратором @flow. Она описывает логику взаимодействия задач: порядок выполнения, передачу данных и обработку условий. Flow — это и есть ваш DAG (направленный ациклический граф), только строится он динамически.

Различие между ними фундаментально. Flow управляет состоянием и структурой, а Task делает «грязную работу». Если Flow падает, Prefect знает, на каком шаге это случилось, и при перезапуске может (при правильной настройке) не выполнять уже успешные задачи повторно.

удобство кода с декораторами @task и @flow

Этот подход делает код чистым. Вы пишете обычные вызовы функций, а 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()

Отслеживание запуска задач и потоков в PrefectCloudAPI

Вывод по коду:

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

 

 

Настройка оркестратора Префект в контейнере с подлкючением к PrefectCloudAPI для мониторинга и управления

 

 

Apache Airflow для инженеров данных

Код курса
AIRF
Ближайшая дата курса
2 марта, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800

 

Заключение

Prefect — это выбор прагматичного инженера данных. Он снимает необходимость бороться с инструментом и позволяет сосредоточиться на коде.

Если ваш проект требует жесткой статической структуры и у вас уже есть команда экспертов по Airflow, миграция может быть нецелесообразна. Однако для новых проектов, ML-задач и команд, ценящих скорость разработки (Time-to-Market), Prefect сегодня является стандартом де-факто в мире современного Python Data Engineering. Он превращает хаос скриптов в упорядоченную, наблюдаемую систему.

Референсные ссылки:

  1. [Pref Documentation: Concepts & Architecture] (https://docs.prefect.io/)
  2. [The Perfect Way: Negative Engineering] (https://www.prefect.io/blog/negative-engineering)
  3. [Airflow vs PREF: Top Differences] (https://towardsdatascience.com/airflow-vs-prefect-2024-comparison)
Изменение базового тарифа с 1 января 2026 года Подробнее