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_project
directory) 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