Iceberg, Delta Lake, Hudi: open table formats
В прошлом уроке мы поняли концепт lakehouse: ACID и schema поверх object storage. Теперь разберём три конкретных open table formats, которые реализуют этот концепт:
- Apache Iceberg — новый де-факто стандарт, 78%+ новых деплоев в 2026.
- Delta Lake — детище Databricks, особенно популярен у их клиентов.
- Apache Hudi — изначально от Uber, фокус на upsert-нагрузках.
Понять различия — важная часть собеседования на DE. Эти форматы выглядят похоже, но имеют тонкие отличия в архитектуре и use cases.
Зачем нужен open table format
Сырой Parquet — это просто файл. Если у тебя в s3://lake/orders/ лежит 1000 Parquet-файлов, это не таблица, это набор файлов. Чтобы превратить их в таблицу с ACID, нужно:
- Знать, какие файлы относятся к таблице (manifest).
- Знать схему (типы колонок, имена).
- Знать партиционирование (как файлы разбиты).
- Уметь атомарно обновлять список файлов (transaction log).
- Хранить версии (для time travel).
Open table format — это спецификация, описывающая, как организовать метаданные для всего этого. Каждый формат — Iceberg, Delta, Hudi — даёт свою реализацию.
Parquet: row groups, column chunks и footer-метаданные — физическая основа open table formatsApache Iceberg
История: создан в Netflix в 2017. Передан в Apache Foundation в 2019. В 2026 — де-факто стандарт.
Ключевые особенности:
- Hidden partitioning. Аналитик не должен знать схему партиций, чтобы писать запросы.
- Schema evolution. Можно добавлять/удалять/переименовывать колонки, менять типы (совместимо).
- Partition evolution. Можно изменить схему партицирования таблицы — это уникально для Iceberg.
- Snapshot isolation. ACID через snapshot’ы (immutable метаданные).
- Engine-agnostic. Spark, Trino, Flink, Hive, Snowflake, Athena — все умеют.
Структура файлов:
my-table/
data/
00001-Parquet-files...
metadata/
v1.metadata.json
v2.metadata.json
snap-12345.avro <- snapshot
manifest-67890.avro <- manifest list
При записи Iceberg создаёт новые data-файлы и обновляет metadata.json с новым snapshot-указателем — атомарная операция.
Caталоги (catalogs):
Iceberg-таблицам нужен catalog — место, которое отслеживает текущий snapshot таблицы. Варианты:
- AWS Glue — managed catalog от Amazon.
- Hive Metastore — классический, переиспользуется.
- Nessie — Git-like catalog с branching.
- REST Catalog — стандартизированный REST API.
- Unity Catalog — Databricks.
Кто использует: Netflix, Apple, Adobe, Stripe, LinkedIn, Pinterest, Airbnb.
Delta Lake
История: создан в Databricks в 2017. Open-sourced в 2019 (Linux Foundation Delta Lake).
Ключевые особенности:
- Транзакционный лог. Каждое изменение — отдельный JSON-файл в
_delta_log/. Простая и понятная модель. - Schema enforcement. Строгая проверка схемы при записи.
- Time travel. Через VERSION AS OF или TIMESTAMP AS OF.
- MERGE syntax. Удобный SQL для upsert:
MERGE INTO target USING source ON ... WHEN MATCHED ... WHEN NOT MATCHED .... - Liquid Clustering. В 2024 представлена техника динамической кластеризации без партиций.
Структура файлов:
my-table/
part-00001-uuid.parquet
part-00002-uuid.parquet
_delta_log/
00000000000000000000.json <- первая операция
00000000000000000001.json <- следующая
00000000000000000010.checkpoint.parquet
Каждая операция (commit) — JSON-файл со списком добавленных и удалённых файлов. Каждые 10 коммитов делается checkpoint (бинарный snapshot) для ускорения чтения метаданных.
Кто использует: все Databricks-клиенты (а это десятки тысяч компаний), Comcast, Adidas, многие финтехи.
Spark DataFrame API: как Spark читает и пишет Delta Lake и IcebergApache Hudi
История: создан в Uber в 2016. Самый старый из трёх. Передан в Apache Foundation.
Ключевые особенности:
- Заточен под upsert. Уникальная фишка Hudi — две стратегии:
- Copy-on-Write (CoW): при upsert файл переписывается. Чтение быстрое, запись медленнее.
- Merge-on-Read (MoR): изменения пишутся в delta-логи, мерджатся при чтении. Запись быстрая, чтение медленнее.
- Стриминговые upsert’ы. Hudi хорошо подходит для CDC-нагрузок.
- Time travel и schema evolution — есть, но менее зрелые, чем у Iceberg/Delta.
- Индексы. Hudi поддерживает bloom-фильтры на ключах для быстрого upsert.
Кто использует: Uber, Walmart, Disney, Robinhood. Меньшая популярность, чем Iceberg/Delta.
Победитель: почему Iceberg
К 2026 году рынок явно склоняется к Apache Iceberg. Причины:
1. Vendor-neutrality. Iceberg не контролируется одной компанией. Netflix, Apple, Adobe, AWS, Snowflake, Databricks, Microsoft, Google — все в Apache-комьюнити.
2. Стандарт в крупных компаниях. Когда Apple и Netflix используют Iceberg, остальные подтягиваются.
3. Snowflake поддержка. Snowflake — гигант DWH-рынка — выбрал Iceberg как стандарт для external tables (2023). Это огромный сигнал.
4. Hidden partitioning. UX для аналитиков лучше, чем у Delta/Hudi.
5. Apache governance. Открытое управление, не зависит от одной компании.
В 2026 году исследования (например, dbt State of Data Engineering) показывают: 78% новых lakehouse-деплоев — на Iceberg. Delta всё ещё силён в Databricks-экосистеме, Hudi занимает узкую нишу upsert-нагрузок.
Iceberg: catalog-архитектура, metadata layer и hidden partitioning — детальный разбор Delta Lake: transaction log, checkpoints и VACUUM — как устроен _delta_log/Если ты junior DE в 2026 и выбираешь, что изучать первым — учи Iceberg. Это та технология, которая будет везде. Delta стоит знать как fallback, если устроишься в Databricks-shop.
Iceberg в действии: пример SQL
С Trino или Spark можно работать с Iceberg как с обычной SQL-таблицей:
-- Создание Iceberg-таблицы
CREATE TABLE catalog.db.orders (
order_id BIGINT,
customer_id BIGINT,
amount DECIMAL(10,2),
created_at TIMESTAMP
)
USING iceberg
PARTITIONED BY (days(created_at));
-- Insert
INSERT INTO catalog.db.orders VALUES (1, 100, 99.99, current_timestamp());
-- Update
UPDATE catalog.db.orders SET amount = 89.99 WHERE order_id = 1;
-- Delete
DELETE FROM catalog.db.orders WHERE customer_id = 100;
-- Time travel
SELECT * FROM catalog.db.orders FOR TIMESTAMP AS OF '2026-05-15 10:00:00';
-- Schema evolution
ALTER TABLE catalog.db.orders ADD COLUMN currency STRING;
ALTER TABLE catalog.db.orders RENAME COLUMN amount TO total_amount;
-- Partition evolution (уникальное для Iceberg)
ALTER TABLE catalog.db.orders REPLACE PARTITION FIELD days(created_at)
WITH hours(created_at);
Совместимость с движками
Какой формат каким движком читается:
Когда что выбирать
Cheat sheet выбора:
- Iceberg — для новых проектов, мульти-движковых сценариев, vendor-neutrality.
- Delta Lake — если работаешь в Databricks или твоя команда уже его использует.
- Hudi — для CDC-нагрузок и стриминговых upsert’ов (но Iceberg догоняет).
- Старт обучения: Iceberg + Spark/Trino. Это даст 80% всех use cases.
Будущее: единый формат?
В 2024-2025 годах появилось понимание, что три формата — это слишком. Несколько инициатив:
- Apache XTable (бывший OneTable) — переводит метаданные между Iceberg/Delta/Hudi. Один файловый формат — три “виды” таблицы.
- Databricks UniForm — Delta + Iceberg в одной таблице (Databricks делает Iceberg-совместимые метаданные).
- Snowflake Iceberg Tables — Snowflake пишет в Iceberg-формате, можно читать снаружи.
К 2027-2028 году, возможно, форматы сольются на уровне совместимости. Но Iceberg уже сейчас явный лидер.
Попробуй сам
Установи PyIceberg через pip install pyiceberg. Поставь локально MinIO в Docker. Создай первую Iceberg-таблицу, сделай несколько INSERT, попробуй UPDATE, DELETE, time travel. Поэкспериментируй с partitioning через days(created_at) и hours(created_at). Альтернатива: бесплатный Databricks Community Edition для Delta Lake — там есть готовый Spark и notebook. Прочувствуй разницу: Iceberg в Trino vs Delta в Spark. Это лучшая практика для понимания форматов.