Cara membuat proyek dbt lokal dengan data dummy untuk tujuan pengujian dengan Docker

dbt (alat pembuatan data) adalah salah satu teknologi terpanas di bidang rekayasa data dan analitik. Baru-baru ini, saya sedang mengerjakan tugas yang melakukan beberapa pasca-pemrosesan pada artefak dbt dan ingin menulis beberapa tes. Untuk melakukannya, saya harus membuat proyek contoh yang dapat berjalan secara lokal (atau dalam container buruh pelabuhan), sehingga saya tidak perlu berinteraksi dengan Data Warehouse yang sebenarnya.

Pada artikel ini kita akan melalui proses langkah demi langkah yang dapat diikuti untuk membuat proyek dbt dan menghubungkannya dengan instance Postgres yang terkontainer. Anda dapat menggunakan proyek tersebut baik untuk tujuan pengujian, atau bahkan untuk bereksperimen dengan dbt itu sendiri untuk mencoba fitur atau bahkan melatih keterampilan Anda.

Langkah 1: Buat proyek dbt

Kami akan mengisi beberapa data dalam database Postgres oleh karena itu, pertama-tama kita perlu menginstal adaptor dbt Postgres dari PyPI:

pip install dbt-postgres==1.3.1

Perhatikan bahwa perintah ini juga akan menginstal paket dbt-core serta dependensi lain yang diperlukan untuk menjalankan dbt.

Sekarang mari kita lanjutkan dan membuat proyek dbt — untuk melakukannya, kita dapat menginisialisasi proyek dbt baru dengan menjalankan perintah dbt init di terminal:

dbt init test_dbt_project

Anda kemudian akan diminta untuk memilih database mana yang ingin Anda gunakan (tergantung pada adaptor yang Anda instal secara lokal, Anda mungkin melihat opsi berbeda):

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

Pastikan untuk memasukkan nomor yang sesuai dengan adaptor Postgres, seperti yang ditunjukkan pada daftar keluaran. Sekarang perintah init seharusnya membuat struktur dasar berikut di direktori tempat Anda menjalankannya:

Langkah 2: Buat file Docker Compose

Sekarang mari kita buat file docker-compose.yml (tempatkan file pada tingkat yang sama dengan test_dbt_projectdirectory) di mana kita akan menentukan dua layanan — satu akan sesuai dengan gambar Postgres yang sudah jadi dan yang kedua dengan gambar dbt yang akan kita definisikan di a Dockerfile pada langkah berikutnya:

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

Seperti yang Anda tahu, untuk container Postgres, kami akan menggunakan image bernama frantiseks/postgres-sakila yang tersedia untuk umum dan dapat diakses di Docker Hub. Gambar ini, akan mengisi Database Sakila di instance Postgres. Basis data memodelkan toko persewaan DVD dan terdiri dari beberapa tabel yang dinormalisasi dan sesuai dengan entitas seperti film, aktor, pelanggan, dan pembayaran. Pada beberapa bagian selanjutnya kita akan menggunakan data ini untuk membuat beberapa contoh model data dbt.

Layanan kedua, yang disebut dbt, akan menjadi layanan yang menciptakan lingkungan tempat kita akan membangun model data. Perhatikan bahwa kita memasang direktori saat ini ke dalam wadah buruh pelabuhan. Ini akan memungkinkan container memiliki akses ke perubahan apa pun yang mungkin kita lakukan pada model data tanpa harus membuat ulang image. Selain itu, metadata apa pun yang dihasilkan oleh perintah dbt (seperti manifet.json) akan langsung muncul di mesin host.

Langkah 3: Buat Dockerfile

Sekarang mari kita tentukan Dockerfile yang akan digunakan untuk membuat image yang di atasnya container yang sedang berjalan akan membuat model yang ditentukan dalam contoh proyek dbt kita.

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

Perhatikan bahwa pada perintah CMD terakhir, kami sengaja menambahkan perintah && sleep infinity tambahan agar container tidak keluar setelah menjalankan langkah-langkah yang ditentukan dalam Dockerfile sehingga kami kemudian dapat mengakses container dan menjalankan perintah dbt tambahan (jika diperlukan).

Langkah 4: Buat profil dbt untuk database Postgres

Sekarang kita telah membuat infrastruktur yang diperlukan untuk mesin host kita untuk membuat database Postgres, mengisi beberapa data dummy serta membuat gambar untuk lingkungan dbt kita, mari fokus pada sisi dbt.

Pertama-tama kita harus membuat profil dbt yang akan digunakan saat berinteraksi dengan database target Postgres. Di dalam direktori test_dbt_project, buat direktori lain bernama profiles dan kemudian file bernama profiles.yml dengan konten berikut:

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

Langkah 5: Tentukan beberapa model data

Langkah selanjutnya adalah membuat beberapa model data berdasarkan data Sakila yang diisi oleh container Postgres. Jika Anda berencana menggunakan proyek ini untuk tujuan pengujian, saya sarankan untuk membuat setidaknya satu benih, satu model, dan snapshot (dengan pengujian jika memungkinkan) sehingga Anda memiliki cakupan penuh dari semua entitas dbt (tidak termasuk makro).

Saya telah membuat beberapa model data, seed dan snapshot, yang dapat Anda akses di repositori ini



Langkah 6: Jalankan kontainer Docker

Kami sekarang memiliki semua yang kami perlukan untuk menjalankan dua kontainer buruh pelabuhan yang kami tentukan di file docker-compose.yml sebelumnya, dan membangun model data yang ditentukan dalam contoh proyek dbt kami.

Pertama, mari kita buat gambarnya

docker-compose build

Dan sekarang mari kita jalankan container yang sedang berjalan:

docker-compose up

Perintah ini seharusnya menginisialisasi database Postgres menggunakan Database Sakila, dan membuat model dbt yang ditentukan. Untuk saat ini, pastikan Anda memiliki dua container yang berjalan:

docker ps

harus memberikan keluaran yang mencakup satu wadah dengan nama dbt dan satu lagi dengan nama postgres.

Langkah 7: Kueri model pada database Postgres

Untuk mengakses container Postgres, Anda harus terlebih dahulu menyimpulkan id container

docker ps

Dan kemudian lari

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

Kita kemudian perlu menggunakan psql, antarmuka baris perintah yang memberi kita akses ke instance postgres:

psql -U postgres

Jika Anda telah menggunakan model data yang saya bagikan di bagian sebelumnya, kini Anda dapat menanyakan setiap model yang dibuat di Postgres menggunakan kueri di bawah ini.

-- 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;

Langkah 8: Membuat tambahan atau memodifikasi model yang sudah ada

Seperti yang telah disebutkan, file Dockerfile dan docker-compose.yml ditulis sedemikian rupa sehingga container dbt tetap aktif dan berjalan. Oleh karena itu, setiap kali Anda mengubah atau membuat model data, Anda masih dapat menggunakan kontainer tersebut untuk membuat ulang seed, model, snapshot, dan/atau pengujian.

Untuk melakukannya, pertama-tama simpulkan id penampung dari penampung dbt:

docker ps

Kemudian masuk ke running container dengan cara running

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

Dan terakhir jalankan perintah dbt apa pun yang Anda inginkan, bergantung pada modifikasi yang Anda buat pada contoh proyek dbt. Berikut referensi singkat dari perintah yang paling umum digunakan untuk tujuan ini:

# 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

Cara mendapatkan kode lengkap tutorial ini

Saya telah membuat repositori GitHub bernama dbt-dummy yang berisi semua bagian yang Anda butuhkan untuk dengan cepat membuat proyek dbt dalam container yang menggunakan Postgres. Anda dapat mengaksesnya pada tautan di bawah ini.



Proyek ini juga tersedia di bagian proyek contoh dari dokumentasi resmi dbt!

Pikiran Terakhir

Dalam tutorial hari ini kita melalui proses langkah demi langkah untuk membuat proyek dbt di mesin lokal menggunakan Docker. Kami telah membuat dua gambar, satu untuk database Postgres yang juga mengisi database Sakila, dan satu lagi untuk lingkungan dbt kami.

Penting untuk dapat dengan cepat membuat beberapa contoh proyek menggunakan alat pembuatan data yang kemudian dapat digunakan sebagai lingkungan pengujian atau bahkan tempat bermain untuk bereksperimen dan belajar.

"Jadilah anggota" dan baca setiap cerita di Medium. Biaya keanggotaan Anda secara langsung mendukung saya dan penulis lain yang Anda baca. Anda juga akan mendapatkan akses penuh ke setiap cerita di Medium.



Artikel terkait yang mungkin juga Anda sukai