Облачная платформаEvolution

Подключение DBT к Managed Spark через Spark Connect


С помощью этого руководства вы настроите подключение DBT к инстансу Managed Spark с использованием Spark Connect. Вы запустите DBT-проект в VS Code Server на интерактивном ноутбуке и подключите его к данным, расположенным в бакете Object Storage.

Вы будете использовать следующие сервисы:

  • Managed Spark — сервис, который позволяет развернуть кластерное вычислительное решение на основе Apache Spark для распределенной обработки данных.

  • Notebooks — сервис для запуска сред ML и работы DS-специалистов в ноутбуках на платформе Evolution.

Шаги:

Перед началом работы

  1. Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Создайте кластер Data Platform, в котором будут размещены инстансы.

  3. Создайте бакет Object Storage с названием dbt-labs.

    1. В бакете создайте папку raw.

    2. Скачайте файл с данными orders.csv и загрузите его в папку raw.

  4. Создайте инстанс Managed Metastore. Он необходим для управления метаданными о таблицах, загруженных в Object Storage.

    1. В блоке Источник выберите Object Storage.

    2. В поле Путь до warehouse укажите бакет dbt-labs.

  5. Создайте инстанс Managed Spark. В блоке Настройки доступа активируйте опцию Подключить публичный хост.

  6. Дождитесь, когда статус инстанса Managed Spark сменится на «Готов».

  7. Создайте Spark Connect. Активируйте опцию Добавить Spark конфигурацию (–conf) и укажите следующие параметры и их значения:

    Аргумент

    Значение

    spark.sql.catalogImplementation

    hive

    spark.sql.warehouse.dir

    s3a://dbt-labs/

    spark.hadoop.hive.metastore.uris

    Thrift URL из карточки созданного ранее инстанса Managed Metastore

  8. Создайте API-ключ. В поле Сервисы выберите Evolution Data Platform. Сохраните значение API-ключа, после закрытия окна получить его будет нельзя.

  9. Создайте секрет. В поле Значение секрета выберите Стандартный режим и введите сохраненное ранее значение API-ключа.

  10. Создайте ноутбук на основе базового образа VSCode-Server.

    1. В блоке Окружение и данные добавьте следующие переменные и их значения:

      Ключ

      Значение

      host

      Публичный хост из карточки созданного ранее инстанса Managed Spark

      port

      443

    2. В блоке Окружение и данные добавьте переменную с секретом.

      1. В поле Ключ введите apikey.

      2. В поле Секрет выберите созданный ранее секрет.

1. Настройте окружение

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

  1. Откройте терминал: нажмите Кнопка Меню и выберите View → Terminal.

  2. Создайте рабочую папку dbt:

    mkdir dbt
  3. В папке dbt создайте файл requirements.txt со следующим содержимым:

    dbt-spark==1.9.3
    pyspark[connect]==3.5.4
    pandas>=1.0.5
    pyarrow>=4.0.0
    grpcio>=1.48.1
    ipykernel>=7.2.0
  4. Создайте виртуальное окружение:

    python -m venv .venv
  5. Активируйте виртуальное окружение:

    source .venv/bin/activate
  6. Установите зависимости:

    pip install -r requirements.txt
  7. Скачайте корневой сертификат:

    mkdir ./certs && wget -O ./certs/dp_cert.crt https://xbox.cloud.ru/index.php/s/wEso6nB7bKYxkkf/download --no-check-certificate
  8. Добавьте путь к сертификату в переменную окружения:

    export GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=/home/jovyan/dbt/certs/dp_cert.crt

2. Создайте внешнюю таблицу

На этом шаге вы с помощью скрипта запустите Spark Connect и создадите таблицу Hive Metastore.

  1. В папке dbt создайте файл spark_connect.ipynb.

  2. В файле spark_connect.ipynb добавьте ячейку и вставьте в нее скрипт для создания Spark Connect:

    import os
    from pyspark.sql import SparkSession
    host = os.environ["host"]
    port = os.environ["port"]
    apikey = os.environ["apikey"]
    os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "./certs/dp_cert.crt"
    spark = SparkSession.builder.remote(f"sc://{host}:{port}/;use_ssl=true;x-api-key={apikey}").getOrCreate()
  3. Запустите код в ячейке.

  4. Добавьте вторую ячейку и вставьте в нее скрипт для создания внешней таблицы:

    # Создайте базу данных в hive metastore
    spark.sql("CREATE DATABASE IF NOT EXISTS raw")
    # Создайте внешнюю таблицу, для чтения данных из ObjectStorage
    spark.sql("""
    CREATE EXTERNAL TABLE IF NOT EXISTS raw.orders (
    order_id INT,
    order_date DATE,
    customer_id STRING,
    product STRING,
    category STRING,
    quantity INT,
    unit_price DOUBLE
    )
    USING CSV
    OPTIONS (
    path 's3a://dbt-labs/raw/',
    delimiter ',',
    header 'true'
    )
    """)
    # Проверьте, что данные доступны
    spark.sql("SELECT * FROM raw.orders").show(truncate=False)
  5. Запустите код во второй ячейке.

3. Подготовьте DBT-проект

На этом шаге вы настроите параметры проекта и создадите источники данных и DBT-модели.

  1. В терминале выполните команду:

    dbt init dbt_spark_lab --profiles-dir .
  2. В диалоге настройки укажите следующие значения параметров:

    1. Which database would you like to use?spark.

    2. Hostlocahost.

    3. Desired authentication method optionthrift.

    4. Port443.

    5. Schema (default schema that dbt will build objects in)default.

    6. Threads1.

  3. Откройте файл /dbt_spark_lab/profiles.yml. В строке method: thrift замените thrift на session.

  4. Подготовьте папку /dbt_spark_lab/models/:

    1. Удалите папку example и файл schema.yml.

    2. Загрузите файл sources.yaml.

    3. Cоздайте папку /dbt_spark_lab/models/marts.

    4. Загрузите файл marts_sales_by_category.sql в папку /dbt_spark_lab/models/marts.

4. Запустите DBT

На этом шаге вы запустите построение DBT-проекта.

  1. В терминале перейдите в папку /dbt_spark_lab :

    cd dbt_spark_lab
  2. Создайте переменную окружения для подключения к Spark Connect:

    export SPARK_REMOTE="sc://${host}:${port}/;use_ssl=true;x-api-key=${apikey}"
  3. Запустите DBT-проект:

    dbt build

5. Проверьте работу DBT

На этом шаге вы проверите работу DBT с помощью запроса к внешней таблице.

  1. Перейдите в файл spark_connect.ipynb.

  2. Добавьте ячейку и выполните запрос:

    spark.sql("SELECT * FROM marts_sales_by_category").show(truncate=False)

Результат

Вы научились настраивать подключение к инстансам Managed Spark и Managed Metastore и запускать DBT-проекты на интерактивном ноутбуке.