Snowflake и Apache Iceberg
dbt поддерживает материализацию таблиц в формате Iceberg двумя разными способами:
- Поле конфигурации модели
table_format = 'iceberg'(устаревший способ) - Интеграция с каталогом, которую можно настроить в config-блоке (внутри
.sqlфайла модели), в properties YAML файле (папка модели) или в YAML файле проекта (dbt_project.yml)
Для использования интеграции необходимо создать файл catalogs.yml и применить эту интеграцию на уровне конфигурации.
Подробнее см. в разделе Configure catalog integration.
Мы рекомендуем использовать конфигурацию Iceberg-каталога и указывать каталог в конфигурации модели — это проще в использовании и позволит подготовить код к будущим изменениям. Прямое использование table_format = 'iceberg' в конфигурации модели является устаревшим подходом и ограничивает использование только Snowflake Horizon в качестве каталога. Поддержка каталогов доступна начиная с dbt 1.10+.
Создание Iceberg-таблиц
dbt поддерживает создание Iceberg-таблиц для трёх типов материализаций Snowflake:
Iceberg-каталоги
Snowflake поддерживает Iceberg-таблицы как через встроенные, так и через внешние каталоги, включая:
- Snowflake Horizon (встроенный каталог)
- Polaris/Open Catalog (управляемый Polaris)
- Glue Data Catalog (поддерживается в dbt-snowflake через catalog-linked database с Iceberg REST)
- Iceberg REST-совместимые каталоги
dbt поддерживает встроенный каталог Snowflake и Iceberg REST-совместимые каталоги (включая Polaris и Unity Catalog) в dbt-snowflake.
Чтобы использовать внешний каталог (любой каталог, кроме встроенного), необходимо настроить интеграцию с каталогом. Для этого нужно выполнить SQL-команду, аналогичную приведённой ниже.
Внешние каталоги
Примеры конфигураций для внешних каталогов.
- Polaris/Open Catalog
- Glue Data Catalog
- Iceberg REST API
Для использования Polaris/Open Catalog (управляемый Polaris) необходимо настроить интеграцию с каталогом.
Пример кода:
CREATE CATALOG INTEGRATION my_polaris_catalog_int
CATALOG_SOURCE = POLARIS
TABLE_FORMAT = ICEBERG
REST_CONFIG = (
CATALOG_URI = 'https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog'
CATALOG_NAME = '<open_catalog_name>'
)
REST_AUTHENTICATION = (
TYPE = OAUTH
OAUTH_CLIENT_ID = '<client_id>'
OAUTH_CLIENT_SECRET = '<client_secret>'
OAUTH_ALLOWED_SCOPES = ('PRINCIPAL_ROLE:ALL')
)
ENABLED = TRUE;
Выполнение этой команды зарегистрирует внешний каталог Polaris в Snowflake. После настройки dbt сможет создавать Iceberg-таблицы в Snowflake, регистрируя существование нового объекта базы данных в каталоге как метаданные, а также выполнять запросы к таблицам, управляемым Polaris.
Чтобы настроить Glue Data Catalog в качестве внешнего каталога, необходимо выполнить два предварительных шага:
-
Создать AWS IAM роль для доступа к Glue: Настройте AWS-права так, чтобы Snowflake мог читать Glue Catalog. Обычно это означает создание AWS IAM роли, которую Snowflake будет использовать, с политиками, разрешающими операции чтения каталога Glue (как минимум
glue:GetTableиglue:GetTablesдля соответствующих баз Glue). Также необходимо добавить trust policy, позволяющую Snowflake принимать эту роль (через external ID). -
Настроить интеграцию с каталогом: В Snowflake создайте интеграцию каталога типа GLUE. Это зарегистрирует информацию о Glue Data Catalog и IAM роли в Snowflake. Например:
CREATE CATALOG INTEGRATION my_glue_catalog_int
CATALOG_SOURCE = GLUE
CATALOG_NAMESPACE = 'dbt_database'
TABLE_FORMAT = ICEBERG
GLUE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myGlueRole'
GLUE_CATALOG_ID = '123456789012'
GLUE_REGION = 'us-east-2'
ENABLED = TRUE;
Glue Data Catalog поддерживает спецификацию Iceberg REST, поэтому к Glue можно подключаться через Iceberg REST API.
Материализация таблиц в Snowflake
Начиная с dbt Core v1.11, dbt-snowflake поддерживает базовую материализацию таблиц Iceberg, зарегистрированных в Glue Catalog, через catalog-linked database. Обратите внимание, что инкрементальные материализации пока не поддерживаются.
Для использования этой функциональности требуется:
- Catalog-linked database: необходимо использовать catalog-linked database, настроенную для вашей интеграции Glue Catalog.
- Формат идентификаторов: имена таблиц и колонок должны состоять только из букв и цифр, быть в нижнем регистре и заключаться в двойные кавычки для совместимости с Glue.
Чтобы указать Glue как тип базы данных, добавьте catalog_linked_database_type: glue в разделе adapter_properties:
catalogs:
- name: my_glue_catalog
active_write_integration: glue_rest
write_integrations:
- name: glue_rest
catalog_type: iceberg_rest
table_format: iceberg
adapter_properties:
catalog_linked_database: catalog_linked_db_glue
catalog_linked_database_type: glue
Вы можете настроить интеграцию для каталогов, совместимых со спецификацией Apache Iceberg REST с открытым исходным кодом.
Пример кода:
CREATE CATALOG INTEGRATION my_iceberg_catalog_int
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'dbt_database'
REST_CONFIG = (
restConfigParams
)
REST_AUTHENTICATION = (
restAuthenticationParams
)
ENABLED = TRUE
REFRESH_INTERVAL_SECONDS = <value>
COMMENT = 'catalog integration for dbt iceberg tables'
Для Unity Catalog с bearer token:
CREATE OR REPLACE CATALOG INTEGRATION my_unity_catalog_int_pat
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'my_namespace'
REST_CONFIG = (
CATALOG_URI = 'https://my-api/api/2.1/unity-catalog/iceberg'
CATALOG_NAME= '<catalog_name>'
)
REST_AUTHENTICATION = (
TYPE = BEARER
BEARER_TOKEN = '<bearer_token>'
)
ENABLED = TRUE;
После создания интеграции с внешним каталогом вы сможете:
-
Выполнять запросы к таблицам, управляемым внешним каталогом: Snowflake может выполнять запросы к Iceberg-таблицам, чьи метаданные хранятся во внешнем каталоге. В этом сценарии Snowflake выступает как «читатель» внешнего каталога. Данные таблиц остаются во внешнем облачном хранилище (AWS S3 или GCP Bucket), определённом в конфигурации хранилища каталога. Snowflake использует интеграцию с каталогом для получения метаданных через REST API, а затем читает файлы данных из облачного хранилища.
-
Синхронизировать таблицы, управляемые Snowflake, с внешним каталогом: Вы можете создать Iceberg-таблицу в Snowflake, управляемую Snowflake через облачное хранилище, и затем зарегистрировать/синхронизировать эту таблицу с внешним каталогом. Это позволяет другим движкам обнаруживать эту таблицу.
Конфигурации интеграции каталога dbt для Snowflake
В таблице ниже перечислены поля конфигурации, необходимые для настройки интеграции каталога для Iceberg-таблиц в Snowflake.
| Loading table... |
Вы можете подключаться к внешним Iceberg-совместимым каталогам, таким как Polaris и Unity Catalog, через тип catalog_type = iceberg_rest. Обратите внимание, что поддержка Iceberg REST доступна только при использовании Catalog Linked Databases.
Свойства адаптера
Это дополнительные конфигурации, специфичные для Snowflake, которые можно указывать внутри adapter_properties.
Встроенный каталог
REST-каталог
| Loading table... |
- storage_serialization_policy: Политика сериализации определяет, какое кодирование и сжатие Snowflake будет применять к файлам данных таблицы. Если значение не указано при создании таблицы, оно наследуется от схемы, базы данных или аккаунта. Если значение не указано нигде, используется значение по умолчанию. Изменить этот параметр после создания таблицы нельзя.
- max_data_extension_time_in_days: Максимальное количество дней, на которое Snowflake может автоматически продлить период хранения данных таблицы, чтобы стримы не стали устаревшими. Параметр позволяет ограничить этот период для контроля затрат на хранение или по требованиям комплаенса.
- data_retention_time_in_days: Для управляемых Iceberg-таблиц можно задать период хранения для Snowflake Time Travel и восстановления таблиц сверх значений аккаунта по умолчанию. Для таблиц с внешним каталогом Snowflake использует значение этого параметра для Time Travel и восстановления. По истечении периода хранения Snowflake не удаляет Iceberg-метаданные или снимки из внешнего облачного хранилища.
- change_tracking: Определяет, включено ли отслеживание изменений для таблицы.
- catalog_linked_database: Catalog-linked databases (CLD) позволяют Snowflake автоматически синхронизировать метаданные (включая пространства имён и Iceberg-таблицы) из внешнего Iceberg-каталога и регистрировать их как удалённые таблицы. Использование CLD обязательно, потому что без него dbt не сможет управлять таблицей end-to-end. Snowflake не поддерживает удаление Iceberg-таблиц во внешнем каталоге без CLD — возможно только отвязывание таблицы, что расходится с ожиданиями dbt.
- auto_refresh: Определяет, должен ли Snowflake автоматически опрашивать внешний Iceberg-каталог на наличие обновлений метаданных. Если
REFRESH_INTERVAL_SECONDSне задан, используется интервал по умолчанию — 30 секунд. - target_file_size: Задаёт целевой размер файлов Parquet. Значение по умолчанию —
AUTO.
Настройте интеграцию каталога для управляемых таблиц Iceberg
- Создайте файл
catalogs.ymlв корне проекта dbt.
Пример использования Snowflake Horizon в качестве каталога:
catalogs:
- name: catalog_horizon
active_write_integration: snowflake_write_integration
write_integrations:
- name: snowflake_write_integration
external_volume: dbt_external_volume
table_format: iceberg
catalog_type: built_in
adapter_properties:
change_tracking: True
- Добавьте параметр конфигурации
catalog_nameлибо в config-блок (внутри.sqlфайла модели), либо в properties YAML файл (папка модели), либо в YAML файл проекта (dbt_project.yml).
Примерiceberg_model.sql:
{{
config(
materialized='table',
catalog_name = 'catalog_horizon'
)
}}
select * from {{ ref('jaffle_shop_customers') }}
- Запустите модель dbt командой
dbt run -s iceberg_model.
Дополнительную информацию см. в документации по Snowflake configurations.
Ограничения
Для внешних каталогов Snowflake поддерживает только режим read, то есть может выполнять запросы к таблице, но не может вставлять или изменять данные.
Процесс синхронизации зависит от выбранного каталога. Некоторые каталоги обновляются автоматически, и это можно настраивать через параметры интеграции. Для других каталогов может потребоваться отдельный процесс или джоб для синхронизации метаданных.