Apache Iceberg¶
Раздел 02 · Механизмы · Сравнения
Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.
Область версий: Apache Iceberg 1.9.2; format v2, engine/catalog отдельно. Проверка источников: 2026-11-02.
1. Архитектура и модель данных¶
FACT. Open table format связывает immutable data files с atomic table snapshot через metadata/catalog. Это не database server и не query engine: Spark/Flink/Trino и catalog обеспечивают исполнение/commit. Baseline format v2 отделён от новых v3 возможностей.
flowchart LR
Writer --> Files[Data and delete files]
Files --> Manifests[Manifest list and snapshot]
Manifests --> Catalog[Atomic catalog commit]
Catalog --> Reader
Reader --> Files
2. Физическое хранение и путь записи¶
Metadata JSON ссылается на snapshots/manifest lists/manifests/data и delete files. Колонки имеют field IDs, поэтому schema evolution не полагается только на имя/позицию. Snapshot выбирает полный согласованный набор файлов; immutable objects позволяют readers продолжить старый snapshot до безопасной очистки.
Источники механизма: документация 4.
3. Индексы и путь чтения¶
Manifest/file statistics и partition transforms дают pruning; hidden partitioning отделяет логический query от directory layout. Sort order может улучшить min/max skipping, но это не B-tree, не uniqueness enforcement и не произвольный point lookup. Engine support equality/position deletes нужно проверять по версии connector.
Источники механизма: документация 2, документация 4.
4. Транзакции и consistency guarantees¶
Atomic commit меняет current metadata pointer через поддерживаемый catalog/CAS protocol. Optimistic concurrency проверяет конфликты и может потребовать retry/replanning. Изоляция row-level operations зависит от engine/settings; table snapshot atomicity не означает cross-table ACID и не включает внешние Kafka offsets автоматически.
Источники механизма: документация 1.
5. Репликация, partitioning и sharding¶
Partition spec evolution позволяет новым files использовать другой layout без полной переписи старых; reader учитывает specs metadata. Sharding compute/query — функция engine, не format. Catalog HA и object storage replication — разные failure layers. Data files replication не публикует корректно catalog автоматически.
Источники механизма: документация 2.
6. Конкурентная запись и конфликты¶
Concurrent append может быть совместим при корректном commit retry; overlapping delete/update требует проверки read/write conflicts. Retry после неопределённого commit сначала проверяет, опубликован ли snapshot. Два independent catalogs поверх одного location могут создать divergent histories; нужен единственный согласованный commit authority.
Источники механизма: документация 1.
7. Отказы и восстановление¶
Snapshot rollback помогает при логической ошибке, пока files сохранены; не восстанавливает уже удалённые объекты. Expire snapshots и remove orphan files имеют safety horizons: учитывать длинные readers, paused writers и recovery. Backup catalog metadata, access/keys и data retention совместно.
Источники механизма: документация 3.
8. Масштабирование и ограничения¶
Small files, много manifests/snapshots и delete files замедляют planning и reads. Rewrite data/manifests и expire snapshots — штатное обслуживание с I/O и конфликтами. Каталог может стать bottleneck частых commits; слишком маленький micro-batch ухудшает metadata overhead.
9. Performance trade-offs¶
Плюсы — engine interoperability и schema/partition evolution; цена — maintenance и различия connector capabilities. Merge-on-read deletes экономят rewrite сейчас ценой query work, copy-on-write — обратный trade-off в поддерживающих engine. Нельзя обещать одинаковый MERGE behavior всех readers.
10. Мониторинг и эксплуатация¶
Мониторить commit retries/conflicts, catalog availability, file-size distribution, manifest count, delete-file ratio и age snapshots. Query metrics отделять от object request cost. Периодически проверять, что retained snapshots реально читаются всеми заявленными engines.
11. Сценарии FinTech и iGaming¶
INFERENCE. История transactions/events с corrections и многоengine analytics; bronze/silver/gold snapshots. Source ledger остаётся transactional, format хранит аналитическую историю. Incremental consumption требует engine-specific semantics, не просто сравнения двух произвольных LIST.
12. Когда не выбирать¶
Не выбирать как low-latency per-account transaction engine. Не использовать unsupported connector features и небезопасный каталог. Если workload — одна маленькая локальная таблица, format/catalog maintenance может быть неоправдан.
13. Вопросы на собеседовании¶
Snapshot равно backup? Нет, общий файл может быть удалён вместе со storage/cleanup.
Почему field IDs важнее rename? Позволяют сохранить идентичность колонки без привязки к имени/позиции.
Hidden partitioning равно automatic perfect distribution? Нет, transform выбирает designer и engine всё равно оплачивает skew.
14. Практические SQL/config примеры¶
CREATE TABLE lake.betting.events (
event_id STRING, tenant_id BIGINT, occurred_at TIMESTAMP, amount_minor BIGINT
) USING iceberg
PARTITIONED BY (days(occurred_at));
Spark SQL предполагает настроенный Iceberg catalog lake и compatible runtime. Статический Spark parser не доказывает загрузку Iceberg/поддержку transforms; runtime отсутствует.
15. Дополнительные источники¶
- Первичный источник 1
- Первичный источник 2
- Первичный источник 3
- Первичный источник 4
- Первичный источник 5
Типичные ошибки проектирования¶
Смешивать commit, видимость projection и backup; приписывать формату функции query engine; игнорировать версии и cleanup horizon. Product-specific ошибки и безопасные альтернативы разобраны в разделах 4–9.
Практические упражнения¶
Составьте журнал одной записи: какие файлы/metadata появляются до публикации, что увидит reader при сбое и какой cleanup безопасен. Затем предложите restore drill с проверкой итоговой полноты, включая поздние исправления.