วิธีสร้างโปรเจ็กต์ dbt ในเครื่องด้วยข้อมูลจำลองเพื่อการทดสอบด้วย Docker

dbt (เครื่องมือสร้างข้อมูล) เป็นหนึ่งในเทคโนโลยีที่ร้อนแรงที่สุดในสาขาวิศวกรรมข้อมูลและการวิเคราะห์ เมื่อเร็วๆ นี้ ฉันได้ทำงานที่ดำเนินการหลังการประมวลผลในส่วน dbt artefact และต้องการเขียนการทดสอบบางอย่าง ในการทำเช่นนั้น ฉันต้องสร้างโปรเจ็กต์ตัวอย่างที่สามารถทำงานภายในเครื่อง (หรือในคอนเทนเนอร์นักเทียบท่า) เพื่อที่ฉันจะได้ไม่ต้องโต้ตอบกับคลังข้อมูลจริง

ในบทความนี้ เราจะอธิบายกระบวนการทีละขั้นตอนที่สามารถปฏิบัติตามได้เพื่อสร้างโปรเจ็กต์ 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_projectdirectory) ซึ่งเราจะระบุบริการสองอย่าง - บริการหนึ่งจะสอดคล้องกับอิมเมจ Postgres สำเร็จรูป และอีกบริการหนึ่งสำหรับอิมเมจ dbt ที่เราจะกำหนดใน a 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 ฐานข้อมูลจำลองร้านเช่าดีวีดีและประกอบด้วยหลายตารางที่ได้รับการทำให้เป็นมาตรฐานและสอดคล้องกับเอนทิตี เช่น ภาพยนตร์ นักแสดง ลูกค้า และการชำระเงิน ในอีกไม่กี่ส่วนต่อไปนี้ เราจะใช้ข้อมูลนี้เพื่อสร้างตัวอย่างโมเดลข้อมูล 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 ของเรา

สิ่งสำคัญคือต้องสามารถสร้างโปรเจ็กต์ตัวอย่างได้อย่างรวดเร็วด้วยเครื่องมือสร้างข้อมูลที่สามารถใช้เป็นสภาพแวดล้อมการทดสอบหรือแม้แต่สนามเด็กเล่นสำหรับการทดลองและการเรียนรู้

สมัครสมาชิก และอ่านทุกเรื่องราวบนสื่อ ค่าสมาชิกของคุณสนับสนุนฉันและนักเขียนคนอื่นๆ ที่คุณอ่านโดยตรง คุณจะสามารถเข้าถึงทุกเรื่องราวบนสื่อได้อย่างเต็มที่



บทความที่เกี่ยวข้องที่คุณอาจชอบ