Перейти к основному содержимому

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 (управляемый 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.

После создания интеграции с внешним каталогом вы сможете:

  • Выполнять запросы к таблицам, управляемым внешним каталогом: Snowflake может выполнять запросы к Iceberg-таблицам, чьи метаданные хранятся во внешнем каталоге. В этом сценарии Snowflake выступает как «читатель» внешнего каталога. Данные таблиц остаются во внешнем облачном хранилище (AWS S3 или GCP Bucket), определённом в конфигурации хранилища каталога. Snowflake использует интеграцию с каталогом для получения метаданных через REST API, а затем читает файлы данных из облачного хранилища.

  • Синхронизировать таблицы, управляемые Snowflake, с внешним каталогом: Вы можете создать Iceberg-таблицу в Snowflake, управляемую Snowflake через облачное хранилище, и затем зарегистрировать/синхронизировать эту таблицу с внешним каталогом. Это позволяет другим движкам обнаруживать эту таблицу.

Конфигурации интеграции каталога dbt для Snowflake

В таблице ниже перечислены поля конфигурации, необходимые для настройки интеграции каталога для Iceberg-таблиц в Snowflake.

FieldRequiredAccepted values
nameyesИмя интеграции каталога
catalog_nameyesИмя интеграции каталога в Snowflake. Например, my_dbt_iceberg_catalog
external_volumeyes<external_volume_name>
table_formatyesiceberg
catalog_typeyesbuilt_in, iceberg_rest
adapter_propertiesoptionalСм. ниже
Loading table...

Вы можете подключаться к внешним Iceberg-совместимым каталогам, таким как Polaris и Unity Catalog, через тип catalog_type = iceberg_rest. Обратите внимание, что поддержка Iceberg REST доступна только при использовании Catalog Linked Databases.

Свойства адаптера

Это дополнительные конфигурации, специфичные для Snowflake, которые можно указывать внутри adapter_properties.

Встроенный каталог

REST-каталог

FieldRequiredAccepted values
auto_refreshOptionalTrue или False
catalog_linked_databaseRequired для catalog type: iceberg_restИмя catalog-linked database
catalog_linked_database_typeOptionalТип catalog-linked database. Например, glue
max_data_extension_time_in_daysOptional090, по умолчанию 14
target_file_sizeOptionalЗначения вроде 'AUTO', '16MB', '32MB', '64MB', '128MB'. Регистр не важен
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

  1. Создайте файл 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
  1. Добавьте параметр конфигурации 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') }}
  1. Запустите модель dbt командой dbt run -s iceberg_model.

Дополнительную информацию см. в документации по Snowflake configurations.

Ограничения

Для внешних каталогов Snowflake поддерживает только режим read, то есть может выполнять запросы к таблице, но не может вставлять или изменять данные.

Процесс синхронизации зависит от выбранного каталога. Некоторые каталоги обновляются автоматически, и это можно настраивать через параметры интеграции. Для других каталогов может потребоваться отдельный процесс или джоб для синхронизации метаданных.

Нашли ошибку?

0
Loading