# О каталогах Iceberg

Технический каталог данных — это уровень управления метаданными, который позволяет пользователям и инструментам программно обнаруживать, изучать и контролировать ресурсы данных, доступные на различных платформах данных и в различных движках выполнения запросов.

## История развития

В начале 2010-х годов, с появлением [Hadoop](https://hadoop.apache.org/) и озёр данных, [Hive Metastore](https://hive.apache.org/) стал стандартом для управления метаданными схем в экосистемах Hadoop. Хотя Hive Metastore эффективно поддерживал первые распределённые движки выполнения запросов с разделением вычислений и хранения, такие как Apache Spark и Trino, он ограничен в типах структурных метаданных, с которыми может работать, и в целом медленнее и дороже современных технических каталогов.

В последние годы появление [стандарта Iceberg](https://iceberg.apache.org/terms/) и его широкое принятие привели к развитию существующих каталогов данных (таких как [Unity Catalog](https://www.unitycatalog.io/)) и созданию новых каталогов с открытым исходным кодом (включая [Polaris](https://polaris.apache.org/) и [Lakekeeper](https://docs.lakekeeper.io/)).

Важно отметить, что **технические каталоги данных** и **бизнес-каталоги** решают разные задачи, хотя и те и другие полезны командам по работе с данными:

* **Технические каталоги данных:** Сосредоточены на структурных метаданных, включая такие сведения о данных, как имена таблиц и столбцов, типы данных, расположение хранилищ (что особенно важно для открытых форматов таблиц) и правила управления доступом. Они могут быть встроены в существующую платформу данных и не требовать настройки — как Databricks Unity Catalog или Snowflake Horizon Catalog — либо управляться отдельно и интегрироваться с каждым движком выполнения запросов. Эти движки используют каталог для поиска, чтения и записи данных.

* **Бизнес-каталоги данных:** Предназначены для более широкого круга пользователей организации (например, BI-аналитиков и менеджеров продуктов). Они дополняют технические метаданные бизнес-контекстом: метриками, определениями бизнес-понятий, показателями качества данных, сведениями о характере использования и владельцах данных.

## Почему каталоги данных важны для dbt

Для пользователей dbt, работающих с архитектурой lakehouse или архитектурой с несколькими движками, каталоги данных могут решать две задачи:

* **Обнаружение таблиц:** Модели dbt материализуются в открытом формате таблиц (часто Iceberg) и регистрируются в каталоге. Понимание структуры каталога критически важно для управления наборами данных и предоставления dbt сведений о том, что уже создано и где находится.

* **Совместимость между движками:** Каталоги Iceberg позволяют читать наборы данных, созданные одним вычислительным движком, с помощью другого, без репликации. Это основа [кроссплатформенного dbt Mesh](https://docs.getdbt.tech/docs/mesh/cross-platform-mesh.md).

Без каталога метаданные каждой таблицы Iceberg необходимо регистрировать в движке выполнения запросов отдельно, что требует множества дополнительных запросов `create iceberg table` и `alter ... refresh`. При использовании каталога метаданные каждой таблицы регистрируются и обновляются автоматически, а сведения обо всех таблицах доступны через единую конечную точку.

За последний год поставщики платформ данных начали добавлять поддержку «связывания» или «федерации» каталогов — механизма, при котором платформа данных управляет синхронизацией метаданных между внешними каталогами данных и собственным управляемым каталогом данных. Это означает, что таблица Iceberg, записанная одним движком выполнения запросов в один каталог, автоматически становится доступной для чтения другому движку. См.: [базы данных Snowflake, связанные с каталогом](https://docs.snowflake.com/en/sql-reference/sql/create-database-catalog-linked), [федерация каталогов Databricks](https://docs.databricks.com/aws/en/query-federation/catalog-federation), [федерация каталогов AWS Glue](https://docs.aws.amazon.com/lake-formation/latest/dg/federated-catalog-data-connection.html), [федерация каталогов BigQuery](https://docs.cloud.google.com/lakehouse/docs/use-catalog-federation).

## Как dbt работает с каталогами Iceberg

dbt использует [каталоги Iceberg, определённые в `catalogs.yml`](https://docs.getdbt.tech/docs/build/iceberg/catalogs-yml.md), чтобы:

* **Материализовывать модели:** Когда dbt материализует модель в виде таблицы или представления, при наличии объявленной интеграции с каталогом используемый адаптер (например, Spark, Trino или Snowflake) создаёт запись о таблице Iceberg в указанном каталоге — встроенном или внешнем.

* **Разрешать ссылки:** Когда dbt читает модель, материализованную в каталоге, он использует «физическое» расположение, определённое активным адаптером (новая спецификация) или интеграцией записи (старая спецификация). Это позволяет ссылаться на модель (таблицу Iceberg) и читать её в одном движке выполнения запросов, даже если изначально она была материализована (записана) другим движком, при условии, что оба движка интегрированы с одним и тем же каталогом.

## Ограничения

За последние несколько лет многие платформы данных, движки выполнения запросов и каталоги данных существенно расширили поддержку стандартов Iceberg — однако это по-прежнему не гарантирует совместимость любого хранилища данных с любым каталогом данных.

Даже если такая поддержка есть, она может быть ограниченной. Например, большинство каталогов Iceberg поддерживают только таблицы (материализации `table` + `incremental` в dbt), но не представления. Они могут не поддерживать атомарные операторы `create table as`, а значит, dbt приходится обновлять таблицы с помощью нескольких операторов без гарантий ACID.

Benoit (специалист по взаимодействию с разработчиками в dbt Labs) создал [полезную визуализацию](https://b-per.github.io/iceberg-roulette/#matrix) (также доступную в виде [увлекательной интерактивной игры](https://b-per.github.io/iceberg-roulette/)), которая показывает текущее состояние совместимости хранилищ данных и каталогов. (Заметили неточность или устаревшую информацию? Создайте issue или PR в [репозитории](https://github.com/b-per/iceberg-roulette).)
