Фреймворк выбора формата по workload
Предыдущие 16 модулей разобрали каждый формат в деталях: внутреннее устройство, кодировки, транзакции, экосистему. Но на практике вопрос не “как работает Iceberg?”, а “какой формат решает мою задачу?”. Этот модуль переворачивает перспективу: вместо “формат → фичи” мы идём от “workload → требования → формат”.
Этот модуль — не повторение сравнительных таблиц из ORC vs Parquet, Avro vs альтернатив, сериализации или next-gen форматов. Мы используем те сравнения как справочник, но строим решение от рабочей нагрузки, а не от фичей формата.
Почему feature matrix не работает
Типичная ошибка — сравнивать форматы по чеклисту: “поддерживает schema evolution? +/−”. Проблема в том, что контекст определяет вес каждого критерия:
Feature Matrix
Feature matrix: список фичей в таблице, галочки напротив каждого формата. Выглядит объективно, но все критерии имеют одинаковый вес — это не отражает реальность.Формат с максимумом + Не оптимален для задачи
Результат: выбирается формат с максимальным числом галочек — но это не значит, что он оптимален для конкретной задачи. Parquet 'побеждает' по числу фичей, но проигрывает Lance в ML-задачах и Avro в стриминге.Workload-First
Workload-first: начинаем с анализа рабочей нагрузки — какие операции доминируют, какая латентность допустима, как часто меняется схема, каков паттерн записи/чтения.Формат под конкретную задачу Оптимален по deal-breakers
Результат: формат, оптимальный для конкретного набора операций. Может не иметь максимума галочек в feature matrix, но закрывает именно те требования, которые критичны.Четыре архетипа workload’ов
Большинство data-pipeline’ов попадают в один из четырёх архетипов. Каждый предъявляет свой набор критичных требований:
Реальные pipeline’ы часто комбинируют архетипы: CDC-поток (стриминг) наполняет lakehouse, на котором работает аналитика (OLAP) и ML-pipeline (ML/AI). В этом случае выбирается формат, оптимальный для доминирующего архетипа, а остальные обслуживаются с приемлемым компромиссом.
Decision Tree: от workload к формату
Вместо таблицы — дерево решений. На каждом уровне — один вопрос, ответ сужает множество кандидатов:
Какой паттерн доступа доминирует?
Первый вопрос: какой паттерн доступа к данным доминирует? Sequential scan (read all/most columns), random point access (read specific rows), или continuous ingest (write-heavy, micro-batches)? Этот вопрос отсекает 50-70% неподходящих форматов.Нужны ACID транзакции?
Нужны ACID, time travel, schema evolution? Если данные — stateless файлы в data lake без обновлений — достаточно голого Parquet/ORC. Если нужны транзакции, обновления, инкрементальные чтения — нужен table format.Нужен vector search?
Нужен vector search (nearest neighbor по embedding'ам)? Если да — Lance (встроенный IVF-PQ/HNSW). Если нет (feature store без embeddings) — Parquet + point-query оптимизация или Lance для random access speed.Транспорт или хранение?
На каком этапе pipeline'а? Транспорт (Kafka topics, message queues) → row-oriented форматы (Avro, Protobuf). Хранение (lakehouse) → table formats с upsert (Hudi, Delta, Paimon).Архетип 1: OLAP / Аналитика
Аналитический workload — самый распространённый случай. Данные записываются пакетно (ETL/ELT), читаются ad-hoc запросами и BI-инструментами.
OLAP Workload
Аналитический workload: SELECT с агрегациями, GROUP BY, JOIN. Читаются 3-5 колонок из 100+ доступных. Предикаты отсекают 90%+ строк. Формат должен минимизировать I/O: читать только нужные колонки и строки.Когда Parquet без table format достаточен
Если ваш pipeline — чистый batch ETL без обновлений и удалений:
- Данные записываются один раз, читаются много раз (write-once, read-many)
- Нет необходимости в ACID-транзакциях (нет конкурентных writer’ов)
- Schema не меняется или меняется крайне редко (добавление колонок — ручной процесс)
- Нет требований к time travel или аудиту
В этом случае table format — overhead. Parquet файлы + партиционирование по дате/региону + Hive metastore или Glue Catalog — проверенная простая архитектура.
Когда нужен table format
Table format оправдан когда:
- Данные обновляются (MERGE/UPDATE/DELETE)
- Нужен time travel для аудита или дебага
- Конкурентные writer’ы (несколько pipeline’ов пишут в одну таблицу)
- Schema evolution — поля добавляются/удаляются/переименовываются регулярно
- Incremental processing — downstream pipeline’ы читают только изменения
Выбор между Delta Lake, Iceberg и Paimon — тема урока 03.
Архетип 2: Стриминг / CDC
Streaming / CDC Pipeline
Стриминг-pipeline состоит из двух фаз: транспорт (message broker → consumer) и хранение (consumer → lakehouse/warehouse). Каждая фаза предъявляет разные требования к формату данных.Delta Lake и Iceberg тоже поддерживают стриминг-запись (Structured Streaming → Delta, Flink → Iceberg). Но у них нет нативного record-level index — upsert на больших таблицах дороже, чем у Hudi/Paimon. Если латентность upsert критична (минуты, не часы) — Hudi MOR или Paimon.
Архетип 3: ML / AI
ML / AI Pipeline
ML-pipeline: training data → feature engineering → model training → serving. Каждая фаза требует особого паттерна доступа: random sampling для training, vector search для retrieval, versioning для воспроизводимости.Когда Parquet + Vector DB лучше Lance
Lance — молодой формат (production с 2023). Parquet + отдельный vector DB оправдан когда:
- Команда уже эксплуатирует Pinecone/Milvus/Qdrant в production
- Табличные данные и embedding’и имеют разные lifecycle’ы (разные retention, разные pipeline’ы)
- Нужна managed-инфраструктура (Pinecone Serverless, Zilliz Cloud)
- Scale > 10B vectors — специализированные vector DB оптимизированы для этого масштаба
Lance оправдан когда нужно единое хранилище для табличных данных и embedding’ов, и dataset versioning — first-class citizen.
Архетип 4: Операционный / OLTP-like
Operational / Near Real-Time
Операционный паттерн: чтение/запись одной строки по ключу с низкой латентностью. Это НЕ классический OLTP (PostgreSQL/MySQL) — это serving layer, где аналитические данные отдаются приложению в реальном времени.Распространённая ошибка — пытаться заменить OLTP-базу на Delta Lake или Iceberg. Table formats оптимизированы для scan’ов и batch operations, не для point reads с миллисекундной латентностью. Если приложению нужен OLTP — используйте OLTP-базу, синхронизируйте через CDC в lakehouse для аналитики.
Сводная карта: workload → формат
Мультиформатные архитектуры
Реальные production-системы редко используют один формат. Типичная архитектура — разные форматы для разных слоёв:
Sources (App, IoT, API)
Источники данных: приложения, IoT-устройства, API. Генерируют события в реальном времени. Формат: JSON/Protobuf на выходе из приложения.Ключевой принцип: каждый слой использует формат, оптимальный для своего паттерна доступа. Не пытайтесь найти один формат для всего pipeline’а. CDC из PostgreSQL в Avro → материализация в Iceberg → export embeddings в Lance → serving через DuckDB — это нормальная архитектура, не over-engineering.
Итоги
В следующем уроке — как правильно проводить бенчмарки форматов: методология, типичные ошибки, воспроизводимость результатов.