Kiến trúc dbt: Project, DAG, compile & run
Hiểu cách dbt tổ chức và chạy giúp bạn thấy vì sao nó vừa linh hoạt vừa đáng tin. Cốt lõi chỉ có ba ý: một dự án (project), một đồ thị phụ thuộc (DAG), và một quy trình compile → run.
Một dự án dbt gồm gì?
Phần tiêu đề “Một dự án dbt gồm gì?”Dự án dbt là một thư mục (quản bằng Git) với các thành phần chính:
| Thư mục/tệp | Chứa gì |
|---|---|
models/ | Các model — file .sql (mỗi file một câu SELECT) + file .yml mô tả & test |
seeds/ | File CSV nhỏ dbt nạp thành bảng (danh mục, mapping) |
snapshots/ | Định nghĩa snapshot — chụp lịch sử thay đổi (SCD type 2) |
tests/ | Test tùy biến viết bằng SQL |
macros/ | Hàm Jinja tái dùng |
dbt_project.yml | Cấu hình dự án (tên, đường dẫn, materialization mặc định) |
DAG — đồ thị phụ thuộc, dbt tự dựng
Phần tiêu đề “DAG — đồ thị phụ thuộc, dbt tự dựng”Bạn không khai báo thứ tự chạy. Thay vào đó, trong mỗi model bạn dùng ref('model_khac') để tham chiếu model khác và source(...) để trỏ tới bảng nguồn. Từ các tham chiếu này, dbt tự dựng DAG (Directed Acyclic Graph — đồ thị có hướng, không vòng lặp) và suy ra thứ tự chạy đúng, song song hóa khi có thể.
flowchart LR SRC1["source:<br/>don_hang_raw"] --> STG1["stg_don_hang"] SRC2["source:<br/>khach_hang_raw"] --> STG2["stg_khach_hang"] STG1 --> INT["int_doanh_thu_theo_khach"] STG2 --> INT INT --> MART["mart_doanh_thu"] MART --> BI["📊 Dashboard"]
Phân lớp model: staging → intermediate → marts
Phần tiêu đề “Phân lớp model: staging → intermediate → marts”Quy ước phổ biến (BSD áp dụng khi dựng nền) chia model thành ba lớp, đúng như DAG ở trên:
- Staging (
stg_) — làm sạch nhẹ từng bảng nguồn: đổi tên cột, ép kiểu, chuẩn hóa. Mỗi nguồn một model staging. - Intermediate (
int_) — ghép, tính toán trung gian, logic nghiệp vụ phức tạp. - Marts (
mart_/fct_/dim_) — bảng cuối cùng phục vụ báo cáo, đúng ngôn ngữ kinh doanh.
Cách phân lớp này khiến pipeline dễ đọc, dễ kiểm thử, dễ tái dùng.
Compile → Run: điều gì xảy ra khi bạn gõ dbt run?
Phần tiêu đề “Compile → Run: điều gì xảy ra khi bạn gõ dbt run?”flowchart LR A["Code SQL + Jinja"] -->|"1. Compile"| B["SQL thuần<br/>(đúng phương ngữ kho)"] B -->|"2. Run"| C["Lệnh CREATE/INSERT<br/>chạy TRONG kho dữ liệu"] C --> D["Bảng/View<br/>được tạo/cập nhật"]
- Compile: dbt thay
ref(),source(), biến Jinja… thành SQL thuần đúng phương ngữ kho dữ liệu (Snowflake/BigQuery/…). - Run: dbt gửi câu lệnh
CREATE TABLE/VIEW … AS SELECT …vào kho dữ liệu để thực thi. Tính toán diễn ra trong kho, dbt chỉ điều phối.
Đọc tiếp
Phần tiêu đề “Đọc tiếp” Model & ref() Viên gạch cơ bản — model là SELECT, ref()/sources nối thành pipeline.
Materialization View, table, incremental, ephemeral — chọn cách hiện thực model.