BI mã nguồn mở 4 — Apache Superset căn bản

13 thg 7, 2026 3 lượt xem
#bi
#dashboard
#superset
#charts
#dataset

Apache Superset là gì?

Ở ba bài đầu loạt này chúng ta đã đi hết Metabase — từ tổng quan so sánh, căn bản tới nâng cao. Từ bài này, ta chuyển sang công cụ còn lại: Apache Superset.

Superset là một nền tảng BI và data exploration mã nguồn mở. Nó ra đời tại Airbnb năm 2015 (ban đầu tên "Panoramix", rồi "Caravel"), sau đó được hiến tặng cho Apache Software Foundation và trở thành một dự án Apache cấp cao (top-level project) từ 2021. Giấy phép là Apache 2.0 — miễn phí, cho phép tuỳ biến và self-host thoải mái, không ràng buộc copyleft như AGPL của Metabase.

Nếu Metabase đặt cược vào sự đơn giản cho nghiệp vụ, thì Superset đặt cược vào sức mạnh cho analyst và kỹ sư dữ liệu. Superset không cố giấu SQL đi; nó ôm lấy SQL, cho analyst một môi trường để khai thác warehouse tối đa: hàng chục loại biểu đồ, một IDE SQL trong trình duyệt (SQL Lab, sẽ nói kỹ ở bài sau), và một mô hình tổ chức lấy dataset làm trung tâm (dataset-centric). Với một ngân hàng như NCB, Superset là công cụ để đội DA/DE dựng những dashboard phân tích sâu — cơ cấu huy động, dòng tiền, rủi ro — trên warehouse PostgreSQL on-prem.

Kiến trúc Superset

Hiểu kiến trúc trước khi bấm nút là cách nhanh nhất để về sau debug được hiệu năng và vận hành. Superset gồm bốn khối chính.

1. Web application (Flask)

Lõi backend Superset là một ứng dụng web viết bằng Python, dựa trên framework Flask (và Flask-AppBuilder cho phần quản trị/phân quyền). Frontend là React. Ứng dụng này phục vụ toàn bộ giao diện, xử lý đăng nhập/phân quyền, lưu và đọc định nghĩa dataset/chart/dashboard, và điều phối việc chạy truy vấn. Trong triển khai thực tế, tiến trình web thường chạy sau một WSGI server như Gunicorn, phía trước có reverse proxy (Nginx).

2. Metadata database

Superset không tự lưu dữ liệu nghiệp vụ. Nó chỉ lưu metadata — định nghĩa mọi thứ bạn tạo ra: danh sách database kết nối, các dataset, metric, chart, dashboard, người dùng, role, quyền. Metadata này nằm trong một cơ sở dữ liệu riêng gọi là metadata database, khuyến nghị dùng PostgreSQL hoặc MySQL cho production (mặc định là SQLite chỉ hợp để thử nghiệm). Đây là "bộ não" của Superset: sao lưu metadata database là sao lưu toàn bộ công sức dựng dashboard.

Cần phân biệt rõ hai loại database:

  • Metadata database — nơi Superset lưu định nghĩa của chính nó.
  • Analytics database / warehouse — nơi chứa dữ liệu nghiệp vụ (số dư, giao dịch) mà chart truy vấn.

Với NCB, warehouse là PostgreSQL on-prem chứa customers, accounts, transactions...; còn metadata database là một PostgreSQL nhỏ riêng biệt.

3. Celery worker + cache (async query)

Nhiều truy vấn phân tích chạy lâu (quét hàng chục triệu giao dịch). Nếu chạy đồng bộ trong tiến trình web, người dùng phải chờ trong khi trình duyệt treo. Superset giải bài toán này bằng Celery — một hệ thống hàng đợi tác vụ (task queue) chạy nền:

  • Async query: khi bật chế độ bất đồng bộ, truy vấn nặng được đẩy vào hàng đợi (qua message broker như Redis hoặc RabbitMQ); một Celery worker nhặt tác vụ, chạy truy vấn xuống warehouse, ghi kết quả vào nơi lưu tạm; giao diện poll và hiển thị khi xong. Tiến trình web không bị chặn.
  • Caching: Superset cache kết quả truy vấn (và metadata) vào một backend như Redis. Lần sau mở cùng một chart trong khoảng TTL (time-to-live), kết quả trả về từ cache thay vì hỏi lại warehouse — giảm tải cơ sở dữ liệu gốc và tăng tốc dashboard.
  • Scheduled tasks: Celery Beat còn chạy các tác vụ định kỳ như làm ấm cache (cache warm-up), gửi report/alert theo lịch.

4. Kết nối warehouse qua SQLAlchemy

Superset không viết driver riêng cho từng database. Nó dùng SQLAlchemy — thư viện toolkit/ORM SQL của Python — làm lớp trừu tượng kết nối. Mỗi loại cơ sở dữ liệu được cấu hình bằng một SQLAlchemy URI (ví dụ postgresql://user:pass@host:5432/dbname) và một driver Python DBAPI tương ứng (như psycopg2 cho PostgreSQL). Nhờ SQLAlchemy, Superset kết nối được tới rất nhiều engine — PostgreSQL, MySQL, ClickHouse (ch-01-overview), BigQuery, Snowflake, Trino... — bằng cùng một cơ chế, chỉ khác URI và driver. Đây là lý do Superset "nói chuyện" được với hầu hết mọi warehouse.

Luồng làm việc: từ database tới dashboard

Trải nghiệm dựng dashboard trên Superset đi theo một chuỗi bốn bước rõ ràng. Điểm khác biệt cốt lõi so với Metabase: Superset lấy dataset làm trung tâm — bạn không vẽ chart trực tiếp trên bảng thô, mà luôn qua một lớp Dataset.

Bước 1 — Kết nối database

Settings → Database Connections → + Database, bạn khai báo kết nối tới warehouse: chọn loại database, nhập SQLAlchemy URI (host, cổng, tên DB, credentials). Đây đồng thời là ranh giới bảo mật — tài khoản dùng để kết nối nên là read-only với quyền tối thiểu, vì mọi truy vấn của chart/SQL Lab đều chạy dưới danh nghĩa tài khoản này. (Chi tiết an toàn ở osbi-07-governance-security.) Trong cấu hình kết nối có các tuỳ chọn quan trọng: cho phép DML hay không (nên tắt với warehouse phân tích), giới hạn số dòng trả về, bật async query, đặt schema mặc định.

Bước 2 — Tạo Dataset

Dataset là trái tim của Superset. Có hai loại:

Physical dataset — ánh xạ một-một tới một bảng (hoặc view) vật lý trong warehouse. Bạn chọn database → schema → bảng, Superset đọc cấu trúc cột và tạo dataset. Ví dụ dataset accounts trỏ thẳng tới bảng accounts.

Virtual dataset — định nghĩa bằng một câu SQL thay vì một bảng. Superset lưu câu SQL đó và gói nó trong một subquery mỗi khi chart truy vấn (đại loại SELECT ... FROM (câu SQL của bạn) AS virtual_table). Virtual dataset cực kỳ hữu ích khi bạn cần join nhiều bảng, lọc sẵn, hoặc tính toán trước rồi coi kết quả như một "bảng logic" để nhiều chart dùng chung. Ví dụ, một virtual dataset "giao dịch kèm khách hàng" join transactions với accountscustomers để mỗi chart không phải viết lại join.

Câu SQL nền của một virtual dataset điển hình — tổng số tiền giao dịch theo loại nghiệp vụ và theo tháng — chạy được trực tiếp trên sandbox PostgreSQL:

-- ▶ Chạy được
SELECT date_trunc('month', created_at) AS thang,
       kind,
       COUNT(*)                        AS so_giao_dich,
       SUM(amount)                     AS tong_tien
FROM transactions
GROUP BY date_trunc('month', created_at), kind
ORDER BY thang, kind;

Lưu kết quả này thành virtual dataset "giao dịch theo tháng", rồi từ đó dựng nhiều chart (biểu đồ cột, đường theo thời gian) mà không lặp lại logic gộp.

Lưu ý về đường học: virtual dataset của Superset là thuần SQL — bạn viết SELECT chuẩn. Đây là điểm "kỹ thuật hơn" so với Metabase, nơi người dùng có thể tránh SQL bằng query builder. Đổi lại, virtual dataset linh hoạt vô hạn.

Bước 3 — Cấu hình cột, metric, cột tính toán trong dataset

Sau khi có dataset, mở phần Edit dataset để định nghĩa ngữ nghĩa (semantics) — đây là lớp semantic layer nhẹ của Superset (chi tiết ở osbi-06-semantic-metrics):

  • Columns (dimension): đánh dấu cột nào là dimension (để nhóm/lọc), cột nào là temporal (mốc thời gian), đặt nhãn hiển thị thân thiện, định dạng số/ngày.
  • Metrics: khai báo các phép tổng hợp dùng lại dưới dạng biểu thức SQL. Ví dụ metric tong_so_du = SUM(balance), so_tai_khoan = COUNT(*), so_du_tb = AVG(balance). Mỗi metric có nhãn, định dạng (ví dụ tiền tệ, phần trăm) và mô tả.
  • Calculated columns: cột phái sinh tính bằng biểu thức SQL trên từng dòng, ví dụ so_du_trieu = balance / 1000000 hay phân loại CASE WHEN balance > 1000000000 THEN 'VIP' ELSE 'thường' END.

Điểm mấu chốt: metric và dimension định nghĩa một lần ở dataset, rồi tái dùng ở mọi chart. Khi công thức "tổng số dư" cần đổi, bạn sửa ở dataset — tất cả chart dùng metric đó tự cập nhật. Đây chính là triết lý dataset-centric.

Bước 4 — Tạo Chart

Một chart (Superset còn gọi cũ là "slice") = một dataset + một kiểu trực quan hoá (visualization type) + cấu hình. Khi tạo chart, bạn:

  1. Chọn dataset nguồn.
  2. Chọn visualization type. Superset có kho biểu đồ phong phú; các loại thường dùng:
Kiểu chartDùng khiVí dụ ngân hàng
Bar chartSo sánh giá trị giữa các nhómSố dư theo chi nhánh
Line chart / Time-seriesXu hướng theo thời gianTổng giao dịch theo tháng
Pie chartCơ cấu/tỷ trọngTỷ trọng số dư theo loại tiền
TableChi tiết dạng bảngTop khách hàng theo số dư
Big NumberMột chỉ số KPI nổi bậtTổng huy động hôm nay
Pivot TableMa trận hai chiềuSố tiền theo kind × tháng
  1. Kéo metric vào ô "Metrics", dimension vào ô "Group by" / trục, thêm filter, sắp xếp. Superset dịch toàn bộ cấu hình này thành một câu SQL gửi xuống warehouse (qua dataset).

Ví dụ, một chart Big Number / Bar đếm số tài khoản theo loại tiền tệ dựa trên metric so_tai_khoan của dataset accounts sinh ra đúng câu SELECT sau — chạy được trên sandbox:

-- ▶ Chạy được
SELECT currency,
       COUNT(*)     AS so_tai_khoan,
       SUM(balance) AS tong_so_du
FROM accounts
GROUP BY currency
ORDER BY so_tai_khoan DESC;

Hiểu rằng mỗi chart bản chất là một câu SQL giúp bạn debug: dashboard chậm hầu như luôn do câu SQL nền chậm, không phải do Superset. Tối ưu nằm ở tầng database (index, materialized view, replica read-only — xem db-opt-06-replication), cộng với cache của Superset.

Bước 5 — Ghép Dashboard

Dashboard là một trang tập hợp nhiều chart, kéo-thả để bố trí lưới (tabs, hàng, cột, markdown chú thích). Mỗi chart trên dashboard giữ nguyên truy vấn nền của nó; dashboard là lớp trình bày và tương tác bên trên.

Filter trên dashboard

Sức mạnh tương tác của Superset nằm ở hệ thống native filters (bộ lọc gốc, kiến trúc filter hiện đại thay cho cơ chế filter box cũ). Ba khái niệm cần nắm:

  • Native filters: các điều khiển lọc đặt ở panel bên trái dashboard — chọn khoảng thời gian, loại tiền tệ, thành phố, loại giao dịch. Khi người dùng chọn, filter được chèn thành mệnh đề WHERE vào truy vấn nền của các chart bị ảnh hưởng, rồi các chart cùng làm mới. Về mặt SQL, thêm filter "loại tiền = VND" chỉ là thêm WHERE currency = 'VND'.
  • Filter scoping: kiểm soát mỗi filter tác động tới những chart nào. Mặc định một filter áp cho toàn bộ dashboard, nhưng bạn có thể giới hạn scope — ví dụ filter "phòng ban" chỉ áp cho khối chart nhân sự, không đụng khối chart giao dịch. Scoping quan trọng khi một dashboard trộn nhiều chủ đề dữ liệu.
  • Cross-filter: cho phép bấm vào một chart để lọc các chart khác. Ví dụ bấm vào cột "VND" trên biểu đồ cơ cấu tiền tệ, các chart còn lại trên dashboard tự lọc theo VND. Đây là cách khoan sâu (drill) tương tác rất mạnh cho analyst.

So sánh cách tiếp cận với Metabase

Cùng là BI mã nguồn mở self-host, nhưng Superset và Metabase phục vụ hai triết lý khác nhau. Bảng dưới đối chiếu ở những chiều đã bàn trong loạt bài:

Chiều so sánhMetabaseApache Superset
Người dùng đíchCán bộ nghiệp vụ, ít/không SQLAnalyst / data engineer, thạo SQL
Cách xây truy vấnQuery builder trực quan (không cần SQL)Dataset (physical/virtual bằng SQL) + chart
Đơn vị trung tâmQuestion (mỗi câu hỏi độc lập)Dataset (metric/dimension tái dùng)
Định nghĩa metricỞ model/questionTập trung ở dataset, dùng lại mọi chart
Kho chartVừa đủRất phong phú, nhiều tuỳ chọn
Đường họcThấpTrung bình–cao (kỹ thuật hơn)
Vận hànhNhẹ (một JAR/container)Nặng hơn (metadata DB, Redis, Celery)

Ý cốt lõi: Superset kỹ thuật hơn và dataset-centric. Ở Metabase, mỗi Question là một đơn vị gần như độc lập, người dùng nghiệp vụ tự dựng bằng query builder. Ở Superset, bạn đầu tư công sức định nghĩa dataset chuẩn (với metric, calculated column) một lần, rồi mọi chart kế thừa — đổi lại đòi hỏi người xây phải hiểu SQL và mô hình dữ liệu. Vì thế nhiều ngân hàng dùng song song: Metabase cho self-service diện rộng của nghiệp vụ, Superset cho analyst dựng dashboard phân tích sâu — cả hai trỏ vào cùng một warehouse.

Owners và chia sẻ cơ bản

Mỗi dataset, chart và dashboard trong Superset có một hoặc nhiều owner — người có quyền chỉnh sửa. Owner được gán khi tạo và có thể thêm/bớt sau. Đây là lớp phân quyền căn bản nhất: người không phải owner (và không có role phù hợp) chỉ xem chứ không sửa được.

Chia sẻ cơ bản gồm: cấp quyền xem qua role của Flask-AppBuilder (ví dụ role Gamma cho người xem, Alpha/Admin cho người dựng); chia sẻ URL trực tiếp tới dashboard/chart; và permalink ghi lại trạng thái filter hiện tại để gửi cho đồng nghiệp. Các cơ chế nâng cao — row-level security (RLS), phân quyền chi tiết theo dataset, kiểm toán — thuộc phạm vi bài governance. Ở mức căn bản, cần nhớ nguyên tắc: kết nối warehouse bằng tài khoản read-only, và chỉ cấp quyền dựng cho người thực sự cần.

Use case thực tế

Bối cảnh: Đội phân tích (analytics) của Khối Nguồn vốn NCB cần một "Dashboard phân tích huy động & dòng tiền" cho ~40 analyst/cán bộ ALM. Dữ liệu nằm trên warehouse PostgreSQL on-prem (customers, accounts, transactions). Yêu cầu: khoan sâu theo loại tiền, loại nghiệp vụ, thời gian; dữ liệu không rời tường lửa.

Cách triển khai bằng Superset:

  1. Kết nối: thêm database bằng SQLAlchemy URI trỏ tới warehouse, dùng tài khoản read-only, tắt DML, giới hạn 50.000 dòng/truy vấn, bật async query.
  2. Dataset:
    • Physical dataset accounts, khai báo metric tong_so_du = SUM(balance), so_tai_khoan = COUNT(*).
    • Virtual dataset "giao dịch theo tháng" từ câu SQL gộp transactions theo date_trunc('month', created_at)kind (đúng câu SQL minh hoạ ở trên), với metric tong_tien = SUM(amount).
  3. Chart:
    • Big Number "Tổng số dư" và "Số tài khoản" từ dataset accounts.
    • Pie chart "Cơ cấu số dư theo loại tiền" (dùng câu GROUP BY currency).
    • Time-series bar "Tổng tiền giao dịch theo tháng, tách theo kind" từ virtual dataset.
    • Pivot table số tiền theo kind × tháng cho phòng ALM.
  4. Dashboard + filter: ghép các chart, thêm native filter thời gian và loại tiền; đặt filter scoping để filter loại tiền chỉ áp cho khối chart số dư; bật cross-filter để bấm vào một loại nghiệp vụ là lọc toàn dashboard.
  5. Cache & Celery: đặt cache TTL 15 phút cho chart tổng hợp nặng; async query qua Celery + Redis để dashboard không treo khi quét giao dịch lớn.
  6. Owners: mỗi dataset/dashboard gán owner là 2 analyst phụ trách; nhóm còn lại role viewer.

Kết quả (minh hoạ): analyst tự dựng và khoan sâu dashboard; metric "tổng số dư" định nghĩa một lần ở dataset, dùng lại ở 5 chart — sửa công thức một chỗ, tất cả tự cập nhật. Chi phí license 0 đồng, dữ liệu không rời data center. So với Metabase (đang phục vụ 300 viewer nghiệp vụ), Superset gánh phần phân tích sâu mà query builder Metabase không với tới.

Ghi nhớ

  • Apache Superset — nền tảng BI & data exploration mã nguồn mở (Apache 2.0), do Airbnb tạo, nay thuộc Apache; hướng analyst/DE, kỹ thuật hơn Metabase.
  • Kiến trúc: Flask web app (React frontend) + metadata database (lưu định nghĩa, không lưu dữ liệu nghiệp vụ) + Celery worker cho async query và cache/broker (Redis) + kết nối warehouse qua SQLAlchemy URI.
  • Luồng dataset-centric: kết nối database → tạo Dataset (physical từ bảng, hoặc virtual từ SQL) → khai báo metric/dimension/calculated column ở dataset → dựng Chart (dataset + visualization type) → ghép Dashboard.
  • Dataset là trung tâm: metric và dimension định nghĩa một lần ở dataset, tái dùng ở mọi chart — sửa công thức một chỗ, tất cả cập nhật.
  • Visualization type phong phú: bar, line/time-series, pie, table, big number, pivot... Mỗi chart bản chất là một câu SQL gửi xuống warehouse.
  • Filter dashboard: native filters (→ chèn WHERE), filter scoping (giới hạn chart bị áp), cross-filter (bấm chart này lọc chart khác).
  • So với Metabase: Superset kỹ thuật hơn, dataset-centric (virtual dataset bằng SQL); Metabase query-builder cho nghiệp vụ. Nhiều nơi dùng song song.
  • Owners & chia sẻ: mỗi dataset/chart/dashboard có owner; phân quyền qua role; nguyên tắc căn bản — kết nối warehouse bằng tài khoản read-only.

Bài viết liên quan

Phân biệt ước lượng điểm và ước lượng khoảng, cách xây khoảng tin cậy (CI) bằng margin of error z*·SE / t*·SE, đánh đổi mức 90/95/99%, và cách DIỄN GIẢI ĐÚNG khoảng tin cậy (95% CI không phải xác suất tham số nằm trong khoảng). Có CI cho trung bình và cho tỷ lệ, ảnh hưởng của cỡ mẫu, cùng ví dụ ngân hàng về tỷ lệ nợ xấu và số dư trung bình.

13 thg 7, 2026 4

Kimball dimensional modeling: bảng fact/dimension, star vs snowflake, grain, và Slowly Changing Dimension.

13 thg 7, 2026 3

Khối OLAP, các thao tác drill-down/roll-up/slice & dice/pivot, OLAP vs OLTP và ROLAP/MOLAP/HOLAP.

13 thg 7, 2026 3

Từ nguồn dữ liệu qua ETL/ELT vào Data Warehouse, Data Mart đến dashboard; staging, ODS, batch vs streaming.

13 thg 7, 2026 3