Lakehouse и Iceberg vs Delta для Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Lake vs Lakehouse vs DWH

Data Warehouse (DWH) — хранилище со структурированными таблицами (Snowflake, BigQuery, ClickHouse). Сильная схема, ACID, дорого.

Data Lake — все сырые файлы в облаке (S3, HDFS, GCS). Любой формат, schema-on-read. Дёшево, но без транзакций, без UPDATE/DELETE, без схемы.

Lakehouse — Data Lake + табличный слой с ACID и метаданными. Лучшее из двух миров: дёшево как lake, надёжно как DWH.

Главная боль без lakehouse — Data Lake без транзакций. Параллельная запись двух job в одну таблицу даёт частично перезаписанные файлы, читатели видят непоследовательное состояние. Iceberg/Delta фиксят это.

На собесе DE: «Что такое lakehouse?» — ответ: «Архитектура, объединяющая дешёвое S3-хранилище и DWH-возможности через табличный формат (Iceberg/Delta/Hudi). ACID, schema evolution, time travel — на S3».

Зачем нужны table formats

Без table format таблица — это «папка с parquet-файлами»:

s3://bucket/orders/
  year=2026/month=05/day=01/part-0000.parquet
  year=2026/month=05/day=01/part-0001.parquet
  ...

Проблемы:

  • Нет транзакций. Запись Spark job упала в середине → файлы написаны частично, читатели видят полупорчу.
  • Нет UPDATE/DELETE. Хочешь обновить строку? Перезаписывай весь файл/партицию.
  • Schema evolution руками. Добавил колонку → старые файлы без неё, читатели падают.
  • Нет time travel. Вчерашний срез — забыли, не вернёшь.

Table format кладёт сверху слой метаданных:

s3://bucket/orders/
  data/                       ← parquet-файлы как раньше
  metadata/                   ← манифесты, версии, snapshots
    snap-1234.avro
    v0.metadata.json
    ...

Метаданные перечисляют, какие файлы относятся к таблице на конкретной версии. Запись = добавление новой версии метаданных, атомарно.

Apache Iceberg

Iceberg — open-source table format, разработанный в Netflix, теперь в Apache. Поддерживается Spark, Trino, Snowflake, BigQuery, ClickHouse.

Особенности:

  • Snapshot-based: каждое изменение = новый snapshot, ссылается на список manifest-файлов
  • ACID на одно table даже на S3
  • Hidden partitioning: партиция вычисляется автоматом из колонки (days(event_time)), запросы используют без знания
  • Schema evolution: add/drop/rename/reorder без переписывания файлов
  • Partition evolution: можно поменять партиционирование без миграции существующих данных
  • Time travel: SELECT * FROM table FOR VERSION AS OF 12345 или FOR TIMESTAMP AS OF '...'
-- Spark SQL
CREATE TABLE catalog.db.orders (
    order_id BIGINT,
    user_id BIGINT,
    amount DECIMAL(18,2),
    event_time TIMESTAMP
) USING iceberg
PARTITIONED BY (days(event_time));

UPDATE catalog.db.orders SET amount = 0 WHERE order_id = 123;

SELECT * FROM catalog.db.orders.history;  -- snapshots

Catalog — метаданные хранятся в каталоге (Hive Metastore, AWS Glue, Nessie, REST). Catalog — единая точка transactions.

Delta Lake

Delta Lake — table format от Databricks, открыт в Linux Foundation. Сильная интеграция с Spark и Databricks.

Особенности:

  • Transaction log в _delta_log/ — JSON-файлы с операциями (commit version)
  • ACID, MERGE, UPDATE, DELETE
  • Time travel
  • Schema evolution
  • Z-ordering: переупорядочивание данных для лучшего pruning
  • OPTIMIZE: компактификация маленьких файлов
# Spark + Delta
df.write.format('delta').partitionBy('event_date').save('s3://bucket/orders/')

from delta.tables import DeltaTable
delta_t = DeltaTable.forPath(spark, 's3://bucket/orders/')
delta_t.update(condition='order_id = 123', set={'amount': '0'})

В Delta всё снято с Hive Metastore не обязательно. Delta хранит метаданные в _delta_log/ рядом с данными.

Минус: ранее был tightly coupled с Spark/Databricks. С Delta 3.0+ совместимость с Trino, Flink, Athena сильно улучшилась.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Apache Hudi

Hudi (Uber) — третий главный формат. Особенности:

  • Copy-on-Write (CoW): запись = новый файл с обновлёнными строками. Хорош для read-heavy.
  • Merge-on-Read (MoR): запись в delta-логи, периодический мерж. Хорош для write-heavy и near-real-time.

Hudi — частый выбор для near-real-time use cases с высоким throughput записи.

В РФ Hudi встречается реже Iceberg/Delta — на собесах обычно достаточно понимать концепцию (CoW vs MoR) и упомянуть, что выбираем под write pattern.

Сравнение и выбор

Атрибут Iceberg Delta Hudi
Открытость Apache Linux Foundation Apache
Связка с движком Любой Spark first-class Spark/Flink
Schema evolution Строгая Строгая Гибкая
Partition evolution Да Нет Нет
Hidden partitioning Да Нет Нет
Time travel Да Да Да
MERGE/UPDATE/DELETE Да Да Да
Read-heavy + + CoW
Write-heavy real-time MoR +

Когда выбирать:

  • Iceberg — open-source приоритет, multi-engine (Spark + Trino + Athena), partition evolution
  • Delta — стек Spark/Databricks, простота
  • Hudi — near-real-time с большим upsert-rate (Uber/Cab/маркетплейс кейсы)

В 2026 году Iceberg и Delta — два основных конкурента, Iceberg набирает в open-source, Delta доминирует в Databricks-окружении.

Частые ошибки

Маленькие файлы без compaction. Streaming-запись в Iceberg/Delta генерирует много мелких файлов. Без OPTIMIZE/compaction со временем — деградация чтения.

Time travel вечный. Каждый snapshot держит файлы. Без vacuum — storage растёт. Iceberg expire_snapshots, Delta VACUUM.

Partition evolution в Delta. Не поддерживается. Если думали менять партиционирование на лету — выбирать Iceberg.

Catalog коллизии. Iceberg/Delta в одной таблице через разные catalog — ад. Стандартизировать catalog (Glue / Hive / Nessie) на старте.

Изменения файлов вне format. Кто-то делает aws s3 cp в data/ → manifests не обновлены → читатели не видят. Все операции — только через format API.

Игнорировать MERGE для CDC. Append-only event log в lakehouse — норма, но иногда нужен upsert. MERGE INTO решает; не пытайся через DELETE+INSERT.

Считать lakehouse как полную замену DWH. Для interactive BI low-latency, dashboards — DWH (CH/Snowflake) часто быстрее. Lakehouse — для batch, ML feature stores, archive.

Связанные темы

FAQ

Можно ли мигрировать Parquet-таблицу в Iceberg?

Да, через CALL system.migrate(...) или ручное создание Iceberg-таблицы поверх существующих Parquet. Существующие файлы не переписываются, добавляется метаданный слой.

Lakehouse заменит DWH?

В каких-то use cases — да (batch ETL, ML, archive). Для интерактивной аналитики и низкой latency специализированные DWH (Snowflake, ClickHouse) часто быстрее. Реальный паттерн — DWH для hot data, lakehouse для cold/archive.

Чем catalog отличается от metastore?

Метастор (Hive Metastore) — старый каталог Hive с ограниченными возможностями. Modern catalogs (Glue, Nessie, Polaris) поддерживают transactions over multiple tables и многое другое. Iceberg использует concept catalog, реализаций много.

Streaming в Iceberg/Delta — хорошо?

Прилично. Spark Structured Streaming пишет в Iceberg/Delta. Для near-real-time ниже минуты — лучше Hudi MoR или специализированные ClickHouse/Druid.

Что такое Z-ordering в Delta?

Линеаризация по нескольким колонкам через space-filling curve. Помогает pruning по нескольким измерениям одновременно. В Iceberg аналог — sort order при write.

Это официальная информация?

Нет. Статья основана на документации Apache Iceberg, Delta Lake, Apache Hudi и общей практике lakehouse-архитектур.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.