Spark, in-memory và elasticity hệ thống lớn
Thuật toán quy mô lớn, cân bằng tải, co giãn đàn hồi, Spark tính toán trong bộ nhớ và ví dụ đám mây.
KhóThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học chia việc nhiều máy và giữ data trong RAM. Dùng để chạy job lớn nhanh mà tiền thuê rẻ.
Kiến thức cần nhớ
Ba trụ hệ lớn
- Đàn hồi: đông thì nở máy, vắng thì co lại.
- Cân bằng tải: chia việc đều, không máy chết dí.
- Ví dụ đời thường: như siêu thị mở thêm quầy lúc đông.
- Việc phải chia nhỏ độc lập để chạy song song.
- Giảm nói chuyện giữa các máy để đỡ nghẽn.
Spark trong RAM
- Định nghĩa: chia data thành miếng, mỗi máy tính cục bộ.
- Giữ trung gian trong RAM thay vì ghi đĩa mỗi vòng.
- Ví dụ đời thường: như giữ đồ trên bàn thay vì cất kho.
- Vòng lặp học máy nhanh hơn hàng chục lần đĩa.
- Mất miếng nào tính lại đúng miếng đó nhờ dòng dõi.
| Cách chạy | Mỗi vòng lặp | Tốc độ lặp |
|---|---|---|
| MapReduce cũ | Ghi đĩa 100GB | Chậm, chờ đĩa |
| Spark RAM | Giữ RAM, ít ghi | Nhanh hơn nhiều |
Đa tài nguyên
- CPU hợp logic rẽ nhánh phức tạp mỗi ngày.
- GPU hợp ma trận đều nhau hàng loạt lớn.
- RAM giữ cache nóng, đĩa mạng giữ checkpoint.
- Ví dụ đời thường: như bếp chia dao thớt lò riêng.
- Thiếu 1 tài nguyên là nghẽn cả hệ thống.
Ví dụ
- Input: job lặp 10 vòng trên 100GB -> Output: Spark nhanh hơn hẳn.
- Giải thích: không ghi đĩa mỗi vòng nên đỡ chờ đọc.
# Đếm từ phân tán kiểu Spark
dem = rdd.flatMap(lambda d: d.split()) # chia nhỏ
dem = dem.map(lambda w: (w, 1)).reduceByKey(lambda a, b: a + b)
print(dem.collect()) # gộp kết quả
💻 Bài tập
Ngôn ngữ: Python 3 với PySpark (chạy local local[*]). Nộp vào day-109/.
Bài 1: RDD và DataFrame cơ bản
- Cài PySpark, tạo
SparkSessionlocal. - Word count bằng RDD:
textFile -> flatMap -> map -> reduceByKey. In top 20. - Cùng bài bằng DataFrame API (
split,explode,groupBy,count). - In kế hoạch thực thi (
explain()) của bản DataFrame. Chỉ ra bước shuffle.
Kết quả RDD và DataFrame giống nhau
Kết quả giống khung MapReduce tự viết ngày 50
Bài 2: Cache và dòng dõi
K-means trên điểm (tự cài bằng RDD, không dùng MLlib):
- Chạy 10 vòng không
cache()dữ liệu. Đo thời gian. - Chạy lại có
points.cache(). Đo thời gian. Mở Spark UI (localhost:4040) chụp tab Storage. - In
toDebugString()của RDD kết quả để thấy dòng dõi. - So với bản
multiprocessingngày 87.
Bài 3: Phân vùng và lệch dữ liệu (nâng cao)
- Join 2 bảng:
orders( dòng) vàcustomers( dòng). Sojointhường vàbroadcastjoin. In thời gian và kế hoạch. - Tạo dữ liệu lệch: 50% đơn thuộc 1 khách hàng. Quan sát 1 task chạy lâu trong Spark UI.
- Sửa lệch bằng salting: thêm hậu tố ngẫu nhiên 0..9 vào khóa nóng, join, rồi gộp lại. So thời gian.
- Thử
spark.sql.shuffle.partitions = 8, 200, 1000. In thời gian.
✅ Tiêu chí hoàn thành
- Word count RDD và DataFrame khớp nhau.
- Bảng thời gian có và không có cache, có ảnh Spark UI.
- Bài 3 có số liệu broadcast join và salting.
- Giải thích được vì sao Spark nhanh hơn MapReduce với thuật toán lặp.
❓ Câu hỏi ôn tập
- Đàn hồi là gì?
- Cân bằng tải để làm gì?
- Spark giữ gì trong RAM?
- Mất 1 miếng thì sao?
🌕 Bạn đã hoàn thành ngày 109. Làm hết bài tập phía trên rồi sang ngày tiếp theo.