Tự triển khai Apache Superset với Docker: Ngừng xuất CSV và bắt đầu trực quan hóa dữ liệu

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Vấn đề: “Nhân viên xuất CSV” giá 150.000 USD một năm

Các “ốc đảo dữ liệu” (data silos) là kẻ sát nhân thầm lặng đối với năng suất của đội ngũ kỹ thuật. Trong hầu hết các nhóm, dữ liệu bị phân tán rải rác giữa PostgreSQL production, ClickHouse logs và các bảng MySQL marketing. Khi một bên liên quan cần báo cáo tăng trưởng hàng tuần, lập trình viên thường phải tạm dừng sprint của họ, viết một SQL join phức tạp và xuất ra file CSV. Nếu việc này lặp lại hai lần mỗi tuần, thực chất bạn đang trả lương cho một kỹ sư cấp cao để làm công việc của một nhân viên nhập liệu thủ công.

Rào cản không phải là thiếu dữ liệu; mà là chi phí tiếp cận. Các công cụ độc quyền như Tableau hay PowerBI có thể dễ dàng tiêu tốn hơn 2.000 USD/tháng cho một đội ngũ quy mô trung bình. Hơn nữa, các nền tảng SaaS này thường gặp khó khăn với các yêu cầu bảo mật on-premise khắt khe. Việc xây dựng dashboard tùy chỉnh bằng React hoặc D3.js cũng hiếm khi là giải pháp tối ưu. Nó tạo ra gánh nặng bảo trì, mất nhiều tuần để triển khai và thậm chí còn lâu hơn để cập nhật.

Đó là lúc Apache Superset xuất hiện. Đây là một nền tảng Business Intelligence (BI) hiện đại, sẵn sàng cho doanh nghiệp, xử lý mọi thứ từ biểu đồ tròn đơn giản đến bản đồ nhiệt (heatmap) không gian địa lý quy mô lớn. Bằng cách sử dụng Docker, bạn có thể đi từ một terminal trống trơn đến một bộ công cụ BI đầy đủ chức năng chỉ trong khoảng năm phút.

Khởi đầu nhanh: Triển khai Superset trong 5 phút

Cách đáng tin cậy nhất để chạy Superset là thông qua cấu hình Docker Compose chính thức. Thiết lập này điều phối web server, cơ sở dữ liệu metadata, lớp cache Redis và các worker chạy ngầm của Celery.

1. Sao chép Repository

Bắt đầu bằng cách lấy phiên bản ổn định mới nhất của mã nguồn:

git clone --depth=1 https://github.com/apache/superset.git
cd superset

2. Khởi tạo môi trường

Superset sử dụng một SECRET_KEY để mã hóa các chuỗi kết nối nhạy cảm. Nếu bạn không thiết lập khóa này, các container có thể sẽ không khởi động được trong môi trường giống như production. Hãy tạo một chuỗi 42 ký tự bảo mật:

openssl rand -base64 42

Mở tệp docker/.env-non-dev và dán khóa của bạn vào trường SUPERSET_SECRET_KEY. Điều này đảm bảo thông tin đăng nhập cơ sở dữ liệu của bạn luôn được mã hóa an toàn.

3. Khởi chạy với Docker Compose

Đối với triển khai tiêu chuẩn, hãy sử dụng cấu hình non-dev. Phiên bản này được tối ưu hóa cho hiệu năng và loại bỏ các thành phần nặng nề của các công cụ phát triển frontend.

docker-compose -f docker-compose-non-dev.yml up -d

Chờ khoảng 2-3 phút để quá trình migration cơ sở dữ liệu hoàn tất. Khi log hiển thị server đã sẵn sàng, hãy truy cập http://localhost:8088. Đăng nhập với thông tin mặc định: admin / admin.

Khám phá bên trong: Kiến trúc hệ thống

Khi bạn chạy lệnh đó, thực chất bạn đang khởi chạy một cụm microservices. Hiểu rõ bốn thành phần sau sẽ giúp bạn khắc phục các vấn đề về hiệu năng sau này:

  • superset_app: Engine dựa trên Flask phục vụ giao diện người dùng (UI) và xử lý các yêu cầu API.
  • superset_db: Một instance PostgreSQL riêng biệt. Nó chỉ lưu trữ dữ liệu nội bộ của Superset, như vai trò người dùng và bố cục dashboard. Nó không lưu trữ dữ liệu kinh doanh của bạn.
  • superset_cache (Redis): Đóng vai trò là bộ nhớ tạm thời. Nếu không có Redis, mỗi lần làm mới dashboard sẽ buộc phải thực hiện một truy vấn mới tới cơ sở dữ liệu production, gây ra tải trọng không cần thiết.
  • superset_worker: Các Celery worker này xử lý các truy vấn nặng trong nền. Điều này giúp giao diện luôn mượt mà ngay cả khi bạn đang xử lý hàng triệu dòng dữ liệu.

Kết nối dữ liệu của bạn

Superset sử dụng SQLAlchemy để kết nối với hầu hết mọi nguồn dữ liệu. Để liên kết cơ sở dữ liệu đầu tiên, hãy điều hướng đến Settings -> Database Connections.

Nếu cơ sở dữ liệu của bạn đang chạy trên cùng một host với Docker, localhost sẽ không hoạt động vì container có mạng riêng. Thay vào đó, hãy sử dụng host.docker.internal. Trên Linux, bạn có thể cần thêm --add-host=host.docker.internal:host-gateway vào file compose của mình.

postgresql://user:[email protected]:5432/my_prod_db

Để làm sạch dữ liệu nhanh chóng trước khi import, tôi thường sử dụng toolcraft.app/vi/tools/data/csv-to-json. Nó xử lý mọi thứ cục bộ trong trình duyệt. Đây là giải pháp cứu cánh khi bạn làm việc với dữ liệu PII nhạy cảm không nên tải lên các trang chuyển đổi ngẫu nhiên.

Mở rộng: Thêm Driver và Bảo mật

Image Superset cơ bản đã bao gồm driver cho PostgreSQL và MySQL. Tuy nhiên, nếu bạn sử dụng ClickHouse, Snowflake hoặc BigQuery, bạn cần tự thêm các driver Python cụ thể.

Bạn không cần phải build lại toàn bộ Docker image cho việc này. Chỉ cần tạo một tệp tên là docker/requirements-local.txt và liệt kê các driver của bạn:

# Ví dụ cho ClickHouse và Snowflake
clickhouse-connect
snowflake-sqlalchemy

Khởi động lại các container. Script entrypoint của Superset sẽ tự động phát hiện tệp này và cài đặt các gói trong quá trình khởi động.

Phân quyền chi tiết

Một trong những tính năng mạnh mẽ nhất của Superset là Kiểm soát truy cập dựa trên vai trò (RBAC). Bạn có thể tạo vai trò “Client View” cho phép người dùng xem dashboard nhưng ẩn SQL Lab. Điều này ngăn người dùng không chuyên vô tình chạy lệnh SELECT * trên một bảng hàng tỷ dòng và làm tăng vọt hóa đơn đám mây của bạn.

Danh sách kiểm tra hiệu năng cho Dashboard nhanh

Không ai thích một dashboard mất 30 giây để tải. Nếu biểu đồ của bạn có cảm giác chậm chạp, hãy kiểm tra ba khu vực sau:

  1. Lớp ngữ nghĩa (Semantic Layer): Đừng để người dùng tiếp cận các bảng thô có 150 cột. Hãy sử dụng chế độ xem “Datasets” để tinh lọc dữ liệu. Đổi tên created_at_utc_unix thành Ngày đăng ký và tính toán trước các chỉ số như Giá trị vòng đời khách hàng.
  2. Truy vấn bất đồng bộ (Async Queries): Đảm bảo các Celery worker đang chạy. Đối với các truy vấn mất hơn 10 giây, việc thực thi bất đồng bộ sẽ ngăn trình duyệt bị timeout.
  3. Persistent Volumes: Luôn kiểm tra xem docker-compose.yml của bạn đã có các mount volume cho cơ sở dữ liệu metadata chưa. Nếu bạn xóa container superset_db mà không có volume, bạn sẽ mất mọi dashboard và vai trò người dùng đã tạo.
volumes:
  superset_home: /app/superset_home
  db_home: /var/lib/postgresql/data

Docker giúp một công cụ phức tạp như Superset trở nên dễ quản lý. Bằng cách thiết lập này, bạn không chỉ đang xây dựng biểu đồ; bạn đang xây dựng một văn hóa tự phục vụ (self-service). Một khi nhóm của bạn có thể tự trả lời các câu hỏi của họ, những tin nhắn Slack kiểu “Bạn chạy giúp mình câu SQL này với?” cuối cùng sẽ chấm dứt.

Share: