Bỏ qua để đến nội dung

Kiến trúc dbt: Project, DAG, compile & run

Hiểu cách dbt tổ chứcchạ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.

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ệpChứ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.ymlCấ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"]
  1. Compile: dbt thay ref(), source(), biến Jinja… thành SQL thuần đúng phương ngữ kho dữ liệu (Snowflake/BigQuery/…).
  2. 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.
Chia sẻ: