Как создать локальный проект 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.
Статьи по теме, которые вам также могут понравиться