Lakehouse и Iceberg vs Delta для Data Engineer
Карьерник — 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; -- snapshotsCatalog — метаданные хранятся в каталоге (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 сильно улучшилась.
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.
Связанные темы
- Data Lake vs Data Warehouse
- Parquet vs ORC vs Avro для DE
- Star schema vs Snowflake schema
- Подготовка к собесу Data Engineer
- Spark на собеседовании DE
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+ вопросами для собесов.