Пошаговое практическое руководство по развертыванию Apache Iceberg и переходу от классических Hive-таблиц к Iceberg за один рабочий день. Примеры настроек, CRUD, time travel, оптимизация и интеграции; время выполнения — 2–5 часов.
0
Статья была полезной?
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…
Вы получите рабочий каталог Iceberg с примерами CRUD-операций, историей снимков (time travel), рекомендациями по оптимизации и списком интеграций. Примерное время выполнения полного руководства — 2–5 часов при наличии выделенной машины с 16 ГБ ОЗУ.
Что такое Iceberg?
Apache Iceberg — это таблиечный формат для аналитических хранилищ данных, ориентированный на надёжность, транзакционность и масштабируемость. К 2026 году Iceberg версии 1.4.0 (релиз 2026) стал стандартом для крупных кластеров благодаря атомарным снимкам (snapshots), поддержке time travel, схем-эволюции и работе с форматом хранения Parquet/ORC/Avro. Iceberg отделяет метаданные от данных: метаданные хранятся в JSON/manifest-файлах, а сами данные — в файлах формата Parquet/ORC. Это позволяет выполнять быстрые инкрементальные сканы, безопасные транзакции и компактные операции rewrite/compaction.
Что вы изучите
Как настроить каталог Iceberg для Hive Metastore и S3-совместимого хранилища.
Примеры CRUD-операций через Spark SQL и командную оболочку.
Как использовать time travel для отката и аудита.
Как оптимизировать таблицы: компакция, переписывание файлов и статистики.
Сравнение с Hive по ключевым сценариям производительности и надёжности.
Список интеграций: Spark, Flink, Trino, Presto, Kafka, Delta Live Tables и CI/CD.
Требования
ОС: Ubuntu 22.04 LTS или RHEL 8 (поддержка systemd).
Java: OpenJDK 17 (релиз 2021) — требуется для Iceberg 1.4.0 (2026).
Spark: 3.4/3.5 (релизы 2023–2025) или Flink 1.16+ для стриминга.
Hadoop/Hive Metastore: Hadoop 3.3+, Hive Metastore 3.1+; Thrift Metastore слушает порт 9083 по умолчанию.
Минимум 8 ГБ ОЗУ и 2 vCPU для дев-машины; рекомендуем 16 ГБ и 4 vCPU для тестового кластера.
S3-совместимое хранилище или MinIO: объектный бакет с минимальной задержкой.
Задача шага: подключить Iceberg к Hive Metastore и S3-совместимому бакету. Мы создадим каталог Spark под именем iceberg_catalog и проверим список баз и таблиц.
# Создать файл конфигурации каталога для Spark (пример: /etc/iceberg/catalogs/iceberg_catalog.properties)
# Содержимое файла:
catalog.type=hive
catalog.uri=thrift://localhost:9083
warehouse=/data/iceberg/warehouse # или s3a://my-bucket/warehouse
Пояснение: этот файл указывает Spark использовать HiveCatalog через Thrift Metastore по адресу thrift://localhost:9083. Для S3 используйте схему s3a:// и настройте credentials через Hadoop-core конфиг.
Причина и фикс: Hive Metastore не запущен или слушает другой порт. Проверьте systemd unit: sudo systemctl status hive-metastore и запустите: sudo systemctl start hive-metastore или исправьте catalog.uri на актуальный адрес.
Шаг 2: CRUD операции
Задача шага: создать таблицу Iceberg, выполнить вставку, обновление и удаление. Демонстрация через spark-sql. Таблица будет храниться в формате Parquet и иметь партиционирование по дате.
-- В spark-sql (подключён catalog iceberg_catalog):
CREATE TABLE iceberg_catalog.default.events (
event_id STRING,
user_id STRING,
event_ts TIMESTAMP,
payload STRING
)
USING iceberg
PARTITIONED BY (days(event_ts))
LOCATION '/data/iceberg/warehouse/default/events';
Пояснение: создаём табличный формат Iceberg. Партиционирование по дате (days) минимизирует мелкие файлы для временных данных.
-- Вставка данных
INSERT INTO iceberg_catalog.default.events VALUES
('e1','u1','2026-02-01 10:00:00','{"a":1}'),
('e2','u2','2026-02-01 11:00:00','{"a":2}');
-- Проверка
SELECT count(*) FROM iceberg_catalog.default.events;
Ожидаемый успешный вывод:
+--------+
|count(1)|
+--------+
| 2|
+--------+
Обновление и удаление (через SQL MERGE или Iceberg SQL):
-- Апдейт: заменить payload для event_id='e1'
MERGE INTO iceberg_catalog.default.events t
USING (SELECT 'e1' as event_id, '{"a":10}' as payload) s
ON t.event_id = s.event_id
WHEN MATCHED THEN UPDATE SET t.payload = s.payload;
-- Удаление
DELETE FROM iceberg_catalog.default.events WHERE event_id = 'e2';
Ожидаемый вывод после MERGE/DELETE:
-- После MERGE и DELETE
SELECT * FROM iceberg_catalog.default.events;
+-------+------+-------------------+---------+
|event_id|user_id|event_ts |payload |
+-------+------+-------------------+---------+
|e1 |u1 |2026-02-01 10:00:00|{"a":10}|
+-------+------+-------------------+---------+
Типичная ошибка: org.apache.iceberg.exceptions.ValidationException: Table is not partitioned by или MERGE is not supported.
Фикс: проверьте версию движка (Spark 3.4+ и Iceberg 1.4.0 обеспечивает поддержку MERGE). Если MERGE не поддерживается, используйте транзакционный подход: создать временную таблицу, выполнить INSERT OVERWRITE или применять Java/Python API Iceberg.
Шаг 3: time travel
Задача шага: показать, как откатиться к предыдущему снимку (snapshot) и выполнить аудит по состоянию таблицы в конкретный момент времени.
-- Посмотреть историю снимков (в spark-sql через SQL-расширение Iceberg)
SELECT * FROM iceberg_catalog.default.events.snapshots();
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…