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

Настройка Apache Spark

Файл profiles.yml предназначен только для пользователей dbt Core

Если вы используете dbt Cloud, вам не нужно создавать файл profiles.yml. Этот файл предназначен только для пользователей dbt Core. Чтобы подключить вашу платформу данных к dbt Cloud, обратитесь к разделу О платформах данных.

Если вы используете Databricks, используйте dbt-databricks

Если вы используете Databricks, рекомендуется использовать адаптер dbt-databricks вместо dbt-spark. Если вы все еще используете dbt-spark с Databricks, рассмотрите возможность миграции с адаптера dbt-spark на адаптер dbt-databricks.

Для версии этой страницы для Databricks обратитесь к разделу Настройка Databricks.

  • Поддерживается: dbt Labs
  • Авторы: core dbt maintainers
  • Репозиторий на GitHub: dbt-labs/dbt-spark
  • Пакет на PyPI: dbt-spark
  • Канал в Slack: db-databricks-and-spark
  • Поддерживаемая версия dbt Core: v0.15.0 и новее
  • Поддержка dbt Cloud: Supported
  • Минимальная версия платформы данных: n/a

Установка dbt-spark

Используйте pip для установки адаптера. До версии 1.8 установка адаптера автоматически устанавливала dbt-core и любые дополнительные зависимости. Начиная с версии 1.8, установка адаптера не устанавливает автоматически dbt-core. Это связано с тем, что адаптеры и версии dbt Core были разделены, и мы больше не хотим перезаписывать существующие установки dbt-core. Используйте следующую команду для установки:

Конфигурация dbt-spark

Для конфигурации, специфичной для Spark, пожалуйста, обратитесь к конфигурациям Spark.

Если вы подключаетесь к Databricks через ODBC-драйвер, потребуется pyodbc. В зависимости от вашей системы, вы можете установить его отдельно или через pip. Подробности установки для различных ОС смотрите в wiki pyodbc.

Если вы подключаетесь к Databricks через ODBC-драйвер, потребуется библиотека pyodbc. В зависимости от вашей системы вы можете установить её отдельно или через pip. Подробности установки для разных операционных систем смотрите на странице вики pyodbc.

Если вы подключаетесь к кластеру Spark через общие методы thrift или http, потребуется PyHive.

# odbc соединения
$ python -m pip install "dbt-spark[ODBC]"

# thrift или http соединения
$ python -m pip install "dbt-spark[PyHive]"
# session соединения
$ python -m pip install "dbt-spark[session]"

Настройка dbt-spark

Для конфигурации, специфичной для Spark, обратитесь к Конфигурация Spark

Для получения дополнительной информации обратитесь к репозиторию GitHub: dbt-labs/dbt-spark

Методы подключения

dbt-spark может подключаться к кластерам Spark четырьмя различными методами:

  • odbc является предпочтительным методом при подключении к Databricks. Он поддерживает подключение к SQL Endpoint или универсальному интерактивному кластеру.
  • thrift подключается напрямую к ведущему узлу кластера, либо локально размещенному, либо в облаке (например, Amazon EMR).
  • http является более общим методом для подключения к управляемому сервису, предоставляющему HTTP endpoint. В настоящее время это включает подключения к интерактивному кластеру Databricks.
  • session подключается к pySpark сессии, работающей локально или на удаленной машине.
Расширенная функциональность

Метод подключения session предназначен для опытных пользователей и экспериментальной разработки dbt. Этот метод подключения не поддерживается в dbt Cloud.

ODBC

Используйте метод подключения odbc, если вы подключаетесь к SQL endpoint или интерактивному кластеру Databricks через ODBC-драйвер. (Скачайте последнюю версию официального драйвера здесь.)

~/.dbt/profiles.yml
your_profile_name:
target: dev
outputs:
dev:
type: spark
method: odbc
driver: [path/to/driver]
schema: [database/schema name]
host: [yourorg.sparkhost.com]
organization: [org id] # Только для Azure Databricks
token: [abc123]

# один из:
endpoint: [endpoint id]
cluster: [cluster id]

# опционально
port: [port] # по умолчанию 443
user: [user]
server_side_parameters:
"spark.driver.memory": "4g"

Thrift

Используйте метод подключения thrift, если вы подключаетесь к Thrift-серверу, расположенному перед кластером Spark, например, кластеру, работающему локально или на Amazon EMR.

~/.dbt/profiles.yml
your_profile_name:
target: dev
outputs:
dev:
type: spark
method: thrift
schema: [database/schema name]
host: [hostname]

# опционально
port: [port] # по умолчанию 10001
user: [user]
auth: [e.g. KERBEROS]
kerberos_service_name: [e.g. hive]
use_ssl: [true|false] # значение hive.server2.use.SSL, по умолчанию false
server_side_parameters:
"spark.driver.memory": "4g"

HTTP

Используйте метод http, если ваш провайдер Spark поддерживает общие подключения через HTTP (например, интерактивный кластер Databricks).

~/.dbt/profiles.yml
your_profile_name:
target: dev
outputs:
dev:
type: spark
method: http
schema: [database/schema name]
host: [yourorg.sparkhost.com]
organization: [org id] # Только для Azure Databricks
token: [abc123]
cluster: [cluster id]

# опционально
port: [port] # по умолчанию: 443
user: [user]
connect_timeout: 60 # по умолчанию 10
connect_retries: 5 # по умолчанию 0
server_side_parameters:
"spark.driver.memory": "4g"

Интерактивные кластеры Databricks могут запускаться несколько минут. Вы можете включить опциональные конфигурации профиля connect_timeout и connect_retries, и dbt будет периодически пытаться повторно подключиться.

Session

Используйте метод session, если вы хотите запускать dbt против pySpark сессии.

~/.dbt/profiles.yml
your_profile_name:
target: dev
outputs:
dev:
type: spark
method: session
schema: [database/schema name]
host: NA # не используется, но требуется `dbt-core`
server_side_parameters:
"spark.driver.memory": "4g"

Опциональные конфигурации

Повторы

Периодические ошибки могут возникать неожиданно при выполнении запросов к Apache Spark. Если retry_all включен, dbt-spark будет наивно повторять любой запрос, который завершился неудачей, основываясь на конфигурации, заданной connect_timeout и connect_retries. Он не пытается определить, была ли ошибка запроса временной или вероятно успешной при повторе. Эта конфигурация рекомендуется в производственных средах, где запросы должны выполняться успешно.

Например, это укажет dbt повторять все неудачные запросы до 3 раз с задержкой в 5 секунд между каждой попыткой:

~/.dbt/profiles.yml
retry_all: true
connect_timeout: 5
connect_retries: 3

Конфигурация на стороне сервера

Spark может быть настроен с использованием Свойств приложения. Используя эти свойства, выполнение может быть настроено, например, для выделения большего объема памяти процессу драйвера. Также, через эти свойства можно настроить выполнение Spark SQL. Например, это позволяет пользователю установить каталоги Spark.

Предостережения

При возникновении трудностей запустите poetry run dbt debug --log-level=debug. Логи сохраняются в logs/dbt.log.

Использование с EMR

Чтобы подключиться к Apache Spark, работающему на кластере Amazon EMR, вам нужно будет запустить sudo /usr/lib/spark/sbin/start-thriftserver.sh на главном узле кластера, чтобы запустить Thrift-сервер (подробнее см. в документации). Вам также нужно будет подключиться к порту 10001, который подключится к Thrift-серверу Spark; порт 10000 вместо этого подключится к Hive-серверу, что не будет работать корректно с dbt.

Поддерживаемая функциональность

Большинство функциональности dbt Core поддерживается, но некоторые функции доступны только на Delta Lake (Databricks).

Функции, доступные только в Delta:

  1. Инкрементальные обновления моделей по unique_key вместо partition_by (см. стратегию merge)
  2. Снимки
  3. Сохранение описаний на уровне столбцов в виде комментариев в базе данных

Пространство имен по умолчанию с методом подключения Thrift

Для выполнения запросов метаданных в dbt вам нужно иметь пространство имен с именем default в Spark при подключении с помощью Thrift. Вы можете проверить доступные пространства имен, используя pyspark и выполнив spark.sql("SHOW NAMESPACES").show(). Если пространство имен по умолчанию не существует, создайте его, выполнив spark.sql("CREATE NAMESPACE default").show().

Если возникнет проблема с сетевым подключением, ваши логи отобразят ошибку, такую как Could not connect to any of [('127.0.0.1', 10000)] (или что-то подобное).

0