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