Конфигурации Starburst/Trino
Требования к кластеру
Назначенный кластер должен иметь прикрепленный каталог, в котором можно создавать, переименовывать, изменять и удалять объекты, такие как таблицы и представления. Любой пользователь, подключающийся к кластеру с помощью dbt, также должен иметь эти же разрешения для целевого каталога.
Свойства сессии
С кластерами Starburst Enterprise, Starburst Galaxy или Trino вы можете устанавливать свойства сессии для изменения текущей конфигурации вашей пользовательской сессии.
Стандартный способ определения свойств сессии — это использование поля session_properties
в вашем profiles.yml
. Это гарантирует, что все подключения dbt будут использовать эти настройки по умолчанию.
Однако, чтобы временно изменить эти свойства сессии для конкретной модели dbt или группы моделей, вы можете использовать хук dbt для установки свойств сессии на конкретной модели dbt. Например:
{{
config(
pre_hook="set session query_max_run_time='10m'"
)
}}
Свойства коннектора
Вы можете использовать свойства таблиц Starburst/Trino для настройки того, как вы хотите, чтобы ваши данные были представлены.
Для получения информации о поддерживаемых функциях для каждого поддерживаемого источника данных обратитесь к Trino Connectors или Starburst Catalog.
Каталоги Hive
Целевой каталог, использующий коннектор Hive и службу метаданных (HMS), является типичным при работе с Starburst и dbt. Следующие настройки рекомендуются для работы с dbt. Цель состоит в том, чтобы гарантировать, что dbt может выполнять часто используемые операторы DROP
и RENAME
.
hive.metastore-cache-ttl=0s
hive.metastore-refresh-interval=5s
Конфигурация формата файла
При использовании коннекторов на основе файлов, таких как Hive, пользователь может настроить аспекты коннектора, такие как используемый формат, а также тип материализации.
Ниже представлена конфигурация таблицы, которая будет материализована как набор разделенных файлов Parquet.
{{
config(
materialized='table',
properties= {
"format": "'PARQUET'",
"partitioning": "ARRAY['bucket(id, 2)']",
}
)
}}
Seeds и подготовленные операторы
Команда dbt seed использует подготовленные операторы в Starburst/Trino.
Подготовленные операторы — это шаблонные SQL-операторы, которые можно выполнять многократно с высокой эффективностью. Значения передаются в отдельном поле, а не жестко кодируются в самой строке SQL. Это часто используется в приложениях для структурирования операторов INSERT
в OLTP базах данных. Из-за этого подготовленные операторы часто имеют столько же переменных-заполнителей (параметров), сколько и столбцов в целевой таблице.
Большинство файлов seed содержат более одной строки, и часто тысячи строк. Это делает размер клиентского запроса таким же большим, как и количество параметров.
Ограничение длины строки заголовка в клиенте HTTP на Python
Вы можете столкнуться с сообщением об ошибке об ограничении длины строки заголовка, если в ваших подготовленных операторах слишком много параметров. Это связано с тем, что ограничение длины строки заголовка в HTTP-клиенте Python составляет 65536
байт.
Вы можете избежать этого ограничения, преобразовав большой подготовленный оператор в более мелкие операторы. dbt уже делает это, группируя весь файл seed в группы строк — одна группа для определенного количества строк в CSV.
Предположим, у вас есть файл seed с 20 столбцами, 600 строками и 12 000 параметров. Вместо создания одного подготовленного оператора для этого, вы можете заставить dbt создать четыре подготовленных оператора INSERT
с 150 строками и 3 000 параметров.
Есть недостаток в группировке строк вашей таблицы. Когда в файле seed много столбцов (параметров), размер пакета должен быть очень маленьким.
Для адаптера dbt-trino
макрос для размера пакета — это trino__get_batch_size()
, и его значение по умолчанию — 1000
. Чтобы изменить это поведение по умолчанию, вы можете добавить этот макрос в ваш проект dbt:
{% macro trino__get_batch_size() %}
{{ return(10000) }} -- Измените это число по своему усмотрению
{% endmacro %}
Другой способ избежать ограничения длины строки заголовка — установить prepared_statements_enabled
в true
в вашем профиле dbt; однако это считается устаревшим поведением и может быть удалено в будущих выпусках.
Материализации
Таблица
Адаптер dbt-trino
поддерживает эти режимы в материализации table
(и полные обновления в материализации incremental
), которые вы можете настроить с помощью on_table_exists
:
rename
— Создает промежуточную таблицу, переименовывает целевую таблицу в резервную и переименовывает промежуточную таблицу в целевую.drop
— Удаляет и воссоздает таблицу. Это преодолевает ограничение на переименование таблицы в AWS Glue.replace
— Заменяет таблицу с использованием оператора CREATE OR REPLACE. Поддержка замены таблицы варьируется в зависимости от коннекторов. Обратитесь к документации по коннектору для получения подробной информации.
Если CREATE OR REPLACE поддерживается в базовом коннекторе, replace
является рекомендуемым вариантом. В противном случае, рекомендуемая материализация table
использует on_table_exists = 'rename'
и также является значением по умолчанию. Вы можете изменить эту конфигурацию по умолчанию, отредактировав один из этих файлов:
- SQL-файл для вашей модели
- файл конфигурации
dbt_project.yml
Следующие примеры настраивают материализацию table
на drop
:
{{
config(
materialized = 'table',
on_table_exists = 'drop`
)
}}
models:
path:
materialized: table
+on_table_exists: drop
Если вы используете материализацию table
и on_table_exists = 'rename'
с AWS Glue, вы можете столкнуться с этим сообщением об ошибке. Вы можете преодолеть ограничение на переименование таблицы, используя drop
:
TrinoUserError(type=USER_ERROR, name=NOT_SUPPORTED, message="Table rename is not yet supported by Glue service")