1. Зачем Iceberg в Data Lakehouse
Apache Iceberg — open table format, ставший стандартом де-факто для современных data lakehouse архитектур. Iceberg обеспечивает надёжное хранение табличных данных поверх object storage (S3, HDFS, MinIO) с гарантиями, привычными по классическим СУБД.
Главная проблема традиционных архитектур — данные копируются между системами. ETL забирает данные из озера в DWH, оттуда в витрины, дальше в BI. Каждая копия — это рассинхронизация, дублирование затрат и рост latency. Iceberg решает это: данные хранятся один раз, запрашиваются из разных движков.
Ключевые возможности Iceberg:
- ACID transactions — атомарные коммиты, изоляция читателей от писателей.
- Schema evolution — добавление, удаление, переименование колонок без перезаписи данных.
- Partition evolution — смена схемы партиционирования без миграции существующих данных.
- Time travel — запросы к историческим снимкам данных по timestamp или snapshot ID.
- Hidden partitioning — автоматическое партиционирование без видимых partition-колонок в запросах.
Apache Doris Multi-Catalog позволяет запрашивать Iceberg-таблицы напрямую, без копирования данных. Принцип «query where data lives» — нулевое дублирование, единый SQL-интерфейс для внутренних и внешних таблиц.
Поддерживаемые каталоги: Hive Metastore, AWS Glue, REST Catalog, Hadoop Catalog.
2. Архитектура: Doris Multi-Catalog + Iceberg
Doris Multi-Catalog — виртуальная абстракция поверх внешних данных. Архитектура трёхуровневая:
| Catalog | Верхний уровень. Один Catalog = одно внешнее хранилище (Iceberg, Hudi, Hive). Создаётся через CREATE CATALOG. |
| Database | Средний уровень. Базы данных внутри каталога — отражают namespace Iceberg. |
| Table | Нижний уровень. Iceberg-таблицы, доступные через стандартный SQL. |
| Data Flow | SQL запрос → Doris FE (план) → Doris BE (чтение Parquet/ORC файлов из S3/HDFS) → результат клиенту. |
Ключевое: Doris читает Parquet/ORC файлы напрямую, используя Iceberg metadata для partition pruning. Нет ETL, нет промежуточного хранения. При этом можно комбинировать: JOIN между Iceberg-таблицами и внутренними таблицами Doris в одном SQL-запросе.
3. Quick Start: подключение Iceberg каталога
Подключение Iceberg каталога к Doris занимает один SQL-запрос. Ниже — три варианта для разных метасторов.
// ICEBERG CATALOG: HIVE METASTORE -- Create Iceberg catalog (Hive Metastore) CREATE CATALOG iceberg_catalog PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'hms',
'hive.metastore.uris' = 'thrift://hive-metastore:9083'
);
-- Switch to catalog SWITCH iceberg_catalog;
-- List databases SHOW DATABASES;
-- Query Iceberg table SELECT * FROM iceberg_catalog.my_db.my_table LIMIT 10; Для REST Catalog (Apache Polaris, Tabular, Nessie):
// ICEBERG CATALOG: REST CREATE CATALOG iceberg_rest PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'rest',
'uri' = 'http://iceberg-rest:8181'
); Для S3 / MinIO с Hive Metastore:
// ICEBERG CATALOG: S3 / MINIO CREATE CATALOG iceberg_s3 PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'hms',
'hive.metastore.uris' = 'thrift://hms:9083',
's3.endpoint' = 'http://minio:9000',
's3.access_key' = 'minioadmin',
's3.secret_key' = 'minioadmin'
); 4. Федеративные запросы: JOIN внутренних и Iceberg таблиц
Главная ценность интеграции — федеративные запросы. Один SQL обращается к данным из внутренних таблиц Doris и внешних Iceberg-таблиц одновременно:
// FEDERATED JOIN: DORIS + ICEBERG SELECT
d.customer_id,
d.customer_name,
i.total_purchases,
i.last_purchase_date
FROM internal.analytics.dim_customers d
JOIN iceberg_catalog.data_lake.fact_purchases i
ON d.customer_id = i.customer_id
WHERE i.last_purchase_date >= '2026-01-01' ORDER BY i.total_purchases DESC LIMIT 100; Что делает Doris под капотом:
- Pushdown предикатов: WHERE-условия передаются на уровень Iceberg metadata — partition pruning и column pruning сокращают объём чтения.
- Materialized Views поверх Iceberg-запросов: автоматическое кеширование горячих данных во внутреннем storage Doris.
- Transparent rewrite: запрос к Iceberg-таблице автоматически перенаправляется на MV, если данные свежие.
- Query optimizer (CBO): Doris использует Iceberg statistics для выбора оптимального плана выполнения.
5. Write-back: запись в Iceberg из Doris
Doris поддерживает не только чтение, но и запись в Iceberg-таблицы:
- INSERT INTO iceberg_catalog.db.table SELECT ... — запись результатов SQL-запросов в Iceberg.
- CREATE TABLE AS SELECT (CTAS) — создание новых Iceberg-таблиц из SQL-запросов.
- Формат записи: Parquet.
- Use case: ETL-трансформации в Doris → результаты в Iceberg → доступ из Spark, Trino, Presto.
- Schema evolution: ALTER TABLE через Doris применяется к Iceberg metadata.
- Partitioned writes: Doris автоматически пишет данные в правильные partition directories.
6. Time Travel и версионность
Iceberg хранит историю изменений через snapshots. Doris позволяет запрашивать данные на любой момент в прошлом:
// ICEBERG TIME TRAVEL -- Query data at a specific point in time SELECT * FROM iceberg_catalog.db.events
FOR TIME AS OF '2026-03-01 00:00:00';
-- Query by snapshot ID SELECT * FROM iceberg_catalog.db.events
FOR VERSION AS OF 12345678901234; Практические сценарии:
- Аудит: «какие данные были в системе на момент отчёта?» — воспроизведение точного состояния на заданную дату.
- Debug: откат к предыдущему состоянию данных для анализа аномалий и ошибок ETL.
- Регуляторные требования: хранение исторических снимков для compliance (SOX, GDPR, НБК).
7. Production: мониторинг и оптимизация
Рекомендации для production-эксплуатации Iceberg + Doris:
- File size: Iceberg рекомендует 100–500 MB файлы. Мелкие файлы снижают производительность чтения.
- Compaction: периодическая компакция мелких файлов через Spark maintenance jobs или Iceberg actions.
- Metadata refresh: REFRESH CATALOG iceberg_catalog — обновление метаданных при изменениях в каталоге.
- Cache: Doris кеширует Iceberg metadata для ускорения повторных запросов. Время TTL настраивается.
- Monitoring: EXPLAIN для анализа pushdown и partition pruning. Проверяйте, что предикаты уходят на уровень каталога.
- Scaling: Doris BE-ноды параллельно читают разные файлы — линейное масштабирование при добавлении нод.
- Column statistics: Iceberg statistics + Doris CBO = оптимальные планы выполнения без ручной настройки.