Как создать локальный проект dbt с фиктивными данными для целей тестирования с помощью Docker

dbt (инструмент построения данных) — одна из самых горячих технологий в области инженерии данных и аналитики. Недавно я работал над задачей, которая выполняет некоторую постобработку артефактов dbt, и хотел написать несколько тестов. Для этого мне пришлось создать пример проекта, который можно было бы запускать локально (или в док-контейнере), чтобы мне не приходилось взаимодействовать с реальным хранилищем данных.

В этой статье мы рассмотрим пошаговый процесс, которому можно следовать, чтобы создать проект dbt и подключить его к контейнерному экземпляру Postgres. Вы можете использовать такие проекты либо в целях тестирования, либо даже для экспериментов с самой dbt, чтобы опробовать функции или даже попрактиковаться в своих навыках.

Шаг 1: Создайте проект dbt

Мы будем заполнять некоторые данные в базе данных Postgres, поэтому сначала нам нужно установить адаптер dbt Postgres из PyPI:

pip install dbt-postgres==1.3.1

Обратите внимание, что команда также установит пакет dbt-core, а также другие зависимости, необходимые для запуска dbt.

Теперь давайте продолжим и создадим проект dbt — для этого мы можем инициализировать новый проект dbt, выполнив команду dbt init в терминале:

dbt init test_dbt_project

Затем вам будет предложено выбрать, какую базу данных вы хотите использовать (в зависимости от адаптеров, которые вы установили локально, вы можете увидеть разные варианты):

16:43:08  Running with dbt=1.3.1
Which database would you like to use?
[1] postgres

(Don't see the one you want? https://docs.getdbt.com/docs/available-adapters)

Enter a number: 1

Обязательно введите номер, соответствующий адаптеру Postgres, как показано в списке вывода. Теперь команда init должна была создать следующую базовую структуру в каталоге, где вы ее выполнили:

Шаг 2. Создайте файл Docker Compose

Теперь давайте создадим файл docker-compose.yml (поместите файл на том же уровне, что и каталог test_dbt_project), в котором мы будем указывать два сервиса — один будет соответствовать готовому образу Postgres, а второй — образу dbt, который мы определим в Dockerfile на следующем шаге:

version: "3.9"

services:
  postgres:
    container_name: postgres
    image: frantiseks/postgres-sakila
    ports:
      - '5432:5432'
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
  dbt:
    container_name: dbt
    build: .
    image: dbt-dummy
    volumes:
      - ./:/usr/src/dbt
    depends_on:
      postgres:
        condition: service_healthy

Как вы понимаете, для контейнера Postgres мы будем использовать образ под названием frantiseks/postgres-sakila, который общедоступен и доступен на Docker Hub. Этот образ заполнит базу данных Sakila в экземпляре Postgres. База данных моделирует магазин проката DVD и состоит из нескольких таблиц, которые нормализованы и соответствуют таким объектам, как фильмы, актеры, клиенты и платежи. В следующих нескольких разделах мы будем использовать эти данные для построения некоторых примеров моделей данных dbt.

Второй сервис, названный dbt, будет создавать среду, в которой мы будем строить наши модели данных. Обратите внимание, что мы монтируем текущий каталог в контейнер докеров. Это позволит контейнеру иметь доступ к любым изменениям, которые мы можем вносить в модели данных, без необходимости перестраивать образ. Кроме того, любые метаданные, сгенерированные командами dbt (например, manifet.json), будут мгновенно отображаться на хост-компьютере.

Шаг 3: Создайте Dockerfile

Теперь давайте укажем Dockerfile, который будет использоваться для создания образа, поверх которого запущенный контейнер затем создаст модели, указанные в нашем примере проекта dbt.

FROM python:3.10-slim-buster

RUN apt-get update \
    && apt-get install -y --no-install-recommends

WORKDIR /usr/src/dbt/dbt_project

# Install the dbt Postgres adapter. This step will also install dbt-core
RUN pip install --upgrade pip
RUN pip install dbt-postgres==1.3.1

# Install dbt dependencies (as specified in packages.yml file)
# Build seeds, models and snapshots (and run tests wherever applicable)
CMD dbt deps && dbt build --profiles-dir profiles && sleep infinity

Обратите внимание, что в последней команде CMD мы намеренно добавили дополнительную команду && sleep infinity, чтобы контейнер не закрывался после выполнения шагов, указанных в Dockerfile, чтобы мы могли затем получить доступ к контейнеру и запустить дополнительные команды dbt (при необходимости).

Шаг 4. Создайте профиль dbt для базы данных Postgres.

Теперь, когда мы создали необходимую инфраструктуру для наших хост-компьютеров, чтобы создать базу данных Postgres, заполнить некоторые фиктивные данные, а также создать образ для нашей среды dbt, давайте сосредоточимся на стороне dbt.

Сначала нам нужно создать профиль dbt, который будет использоваться при взаимодействии с целевой базой данных Postgres. В каталоге test_dbt_project создайте еще один каталог с именем profiles, а затем файл с именем profiles.yml со следующим содержимым:

test_profile:
  target: dev
  outputs:
    dev:
      type: postgres
      host: postgres
      user: postgres
      password: postgres
      port: 5432
      dbname: postgres
      schema: public
      threads: 1

Шаг 5: Определите некоторые модели данных

Следующим шагом является создание некоторых моделей данных на основе данных Sakila, заполненных контейнером Postgres. Если вы планируете использовать этот проект в целях тестирования, я бы посоветовал создать по крайней мере одно семя, одну модель и снимок (по возможности с тестами), чтобы у вас был полный охват всех объектов dbt (за исключением макросов).

Я уже создал несколько моделей данных, семян и снимков, к которым вы можете получить доступ в этом репозитории.



Шаг 6. Запустите контейнеры Docker

Теперь у нас есть все необходимое для запуска двух контейнеров докеров, которые мы указали ранее в файле docker-compose.yml, и построения моделей данных, определенных в нашем примере проекта dbt.

Во-первых, давайте создадим изображения

docker-compose build

А теперь давайте раскрутим запущенные контейнеры:

docker-compose up

Эта команда должна была инициализировать базу данных Postgres с помощью базы данных Sakila и создать указанные модели dbt. А пока давайте удостоверимся, что у вас есть два запущенных контейнера:

docker ps

должен дать вывод, который включает один контейнер с именем dbt и другой с именем postgres.

Шаг 7. Запросите модели в базе данных Postgres.

Чтобы получить доступ к контейнеру Postgres, вам сначала нужно вывести идентификатор контейнера.

docker ps

А потом беги

docker exec -it <container-id> /bin/bash

Затем нам нужно будет использовать psql, интерфейс командной строки, который дает нам доступ к экземпляру postgres:

psql -U postgres

Если вы использовали модели данных, которыми я поделился в предыдущих разделах, теперь вы можете запрашивать каждую из моделей, созданных в Postgres, с помощью приведенных ниже запросов.

-- Query seed tables
SELECT * FROM customer_base;

-- Query staging views
SELECT * FROM stg_payment;

-- Query intermediate views
SELECT * FROM int_customers_per_store;
SELECT * FROM int_revenue_by_date;

-- Query mart tables
SELECT * FROM cumulative_revenue;

-- Query snapshot tables
SELECT * FROM int_stock_balances_daily_grouped_by_day_snapshot;

Шаг 8: Создание дополнительных или изменение существующих моделей

Как уже упоминалось, файлы Dockerfile и docker-compose.yml были написаны таким образом, чтобы контейнер dbt все еще работал. Таким образом, всякий раз, когда вы изменяете или создаете модели данных, вы по-прежнему можете использовать этот контейнер для повторного построения начальных значений, моделей, моментальных снимков и/или тестов.

Для этого сначала определите идентификатор контейнера dbt:

docker ps

Затем войдите в работающий контейнер, запустив

docker exec -it <container-id> /bin/bash

И, наконец, запустите любую команду dbt, которую вы хотите, в зависимости от изменений, которые вы внесли в пример проекта dbt. Вот краткий справочник наиболее часто используемых команд для этих целей:

# Install dbt deps
dbt deps

# Build seeds
dbt seeds --profiles-dir profiles

# Build data models
dbt run --profiles-dir profiles

# Build snapshots
dbt snapshot --profiles-dir profiles

# Run tests
dbt test --profiles-dir profiles

Как получить полный код этого руководства

Я создал репозиторий GitHub под названием dbt-dummy, который содержит все элементы, необходимые для быстрого создания контейнерного проекта dbt, использующего Postgres. Вы можете получить к нему доступ по ссылке ниже.



Этот проект также доступен в разделе примеров проектов официальной документации dbt!

Последние мысли

В сегодняшнем уроке мы рассмотрели пошаговый процесс создания проекта dbt на локальном компьютере с помощью Docker. Мы создали два образа: один для базы данных Postgres, которая также заполняет базу данных Sakila, а другой — для нашей среды dbt.

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

Стать участником и читать все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.



Статьи по теме, которые вам также могут понравиться