Performance Tuning & Cost Optimization
Cluster sizing, Photon cost/perf, serverless vs classic, spot instance, caching, theo dõi chi phí qua system tables.
Chi phí Databricks tính theo DBU (Databricks Unit) cộng thêm chi phí compute cloud nền — dễ vượt ngân sách nếu không hiểu rõ đòn bẩy tối ưu. Đây là kỹ năng vận hành bắt buộc để một hệ thống lakehouse "chạy được" không âm thầm trở thành "đốt tiền" theo thời gian khi khối lượng dữ liệu tăng.
🎯 Mục tiêu học tập
- Sizing cluster đúng theo khối lượng công việc thay vì đoán mò
- Hiểu đánh đổi chi phí/hiệu năng giữa Photon bật/tắt, Serverless/Classic
- Áp dụng caching và các kỹ thuật giảm chi phí tính toán lặp lại không cần thiết
- Theo dõi và cảnh báo chi phí bằng system tables và budget policies
Nguyên tắc Sizing Cluster
Bắt đầu nhỏ, đo lường, rồi scale — không đoán trước kích thước "an toàn". Dùng Spark UI (tab Executors, Stages) để xem có bao nhiêu task đang chờ (queued) vì thiếu executor (cần scale lên) hay executor đang idle nhiều (đang scale quá tay). Với job chạy theo lịch cố định, ưu tiên autoscaling với biên độ hẹp (ví dụ min=2, max=4) hơn là biên độ rộng — autoscaling phản ứng có độ trễ, biên độ quá rộng dễ dẫn đến scale chậm hơn thực tế cần.
Photon & Serverless — đánh đổi chi phí/hiệu năng
Photon tính phí DBU cao hơn theo giờ nhưng thường hoàn thành job nhanh hơn đáng kể — với hầu hết workload SQL/DataFrame nặng tính toán, tổng chi phí thực tế (giờ × giá) thường thấp hơn khi bật Photon vì thời gian chạy giảm nhiều hơn mức tăng giá theo giờ. Tương tự, Serverless có giá/DBU cao hơn Classic nhưng loại bỏ hoàn toàn thời gian chờ khởi động cluster (có thể mất vài phút với Classic) — với job chạy thường xuyên, tổng thời gian tiết kiệm được thường bù lại chênh lệch giá.
Đừng tối ưu theo "giá DBU/giờ" đơn lẻ — luôn tính tổng chi phí = giá/giờ × số giờ chạy thực tế, và luôn thử nghiệm đo thật thay vì suy đoán từ bảng giá.
Caching & tránh tính toán lặp lại
Ngoài Spark cache (Module 4) và Delta cache (tự động cache file đã đọc trên local disk của worker, tăng tốc lần đọc thứ 2 mà không cần chỉ định gì thêm), kỹ thuật quan trọng ở tầng pipeline là incremental processing: dùng Auto Loader/streaming table (Module 6) để chỉ xử lý dữ liệu mới thay vì full refresh toàn bộ bảng mỗi lần chạy — đây là đòn bẩy giảm chi phí lớn nhất cho pipeline chạy định kỳ trên dữ liệu ngày càng lớn.
Theo dõi chi phí bằng System Tables
-- Chi phí theo từng job trong 30 ngày qua
SELECT
usage_metadata.job_id,
SUM(usage_quantity) AS total_dbu
FROM system.billing.usage
WHERE usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
AND usage_metadata.job_id IS NOT NULL
GROUP BY usage_metadata.job_id
ORDER BY total_dbu DESC;
Kết hợp truy vấn định kỳ trên system.billing.usage với budget policies
(đặt ngưỡng cảnh báo/giới hạn chi tiêu theo team hoặc theo tag) để phát hiện sớm cluster/job đang "đốt"
chi phí bất thường — nguyên tắc giống hệt cost monitoring cho AI service đã học ở Module 10-11 khoá AI
Engineer, chỉ khác đơn vị đo là DBU thay vì token.
🏋️ Bài tập thực hành
Chạy lại pipeline đã xây ở Module 6-7 với 3 cấu hình khác nhau: (1) All-purpose cluster không Photon, (2) Job cluster có Photon, (3) Serverless. Ghi lại thời gian chạy và ước tính chi phí (DBU × giá niêm yết) cho mỗi cấu hình, viết kết luận cấu hình nào tối ưu cho pipeline cụ thể này. Viết 1 câu truy vấn system.billing.usage tổng hợp chi phí theo job trong workspace của bạn.
📚 Tài nguyên học tập
-
Databricks — PricingBảng giá chính thức theo loại compute/DBUTrang giá
-
Databricks — Cost optimization guideHướng dẫn tối ưu chi phí chính thứcDocs
-
Databricks — Budget policiesThiết lập cảnh báo/giới hạn ngân sáchDocs
✅ Tự đánh giá hoàn thành
- Sizing được cluster dựa trên quan sát Spark UI thay vì đoán
- Giải thích được khi nào Photon/Serverless tiết kiệm chi phí thực tế dù giá/giờ cao hơn
- Áp dụng incremental processing để giảm chi phí pipeline chạy định kỳ
- Viết được truy vấn system.billing.usage để theo dõi chi phí theo job