App: wordcount MapReduce và Spark job
Xây app đếm từ phân tán: MapReduce thủ công đa tiến trình, Spark job tương đương, so sánh tốc độ, shuffle và fault tolerance.
KhóThuật toán ~120 phút
Ôn lại trước khi học
Giới thiệu
Bài này xây app đếm từ kiểu phân tán. Chia nhỏ văn bản cho nhiều worker cùng đếm.
Kiến thức cần nhớ
MapReduce thủ công 3 bước
- Map: mỗi worker đếm từ cục bộ trong chunk của mình.
- Shuffle: gom cùng 1 từ về cùng 1 reducer theo hash.
- Reduce: cộng tổng từng từ rồi ghi kết quả.
- Ví dụ đời thường: chia xấp phiếu cho nhiều người đếm rồi cộng lại.
Spark job tương đương
- TextFile chia văn bản thành nhiều partition.
- FlatMap tách từ, map thành cặp từ-1, reduceByKey cộng.
- Giữ dữ liệu trung gian trong RAM nên nhanh hơn ghi đĩa.
- Lineage cho chịu lỗi: mất partition nào tính lại partition đó.
Combiner và skew
- Combiner cộng cục bộ trước để giảm hàng gửi qua shuffle.
- Skew là vài từ hot làm 1 reducer quá tải.
- Xử lý skew bằng combiner mạnh hoặc salting.
- MapReduce đơn giản chịu lỗi tốt, Spark nhanh nhờ RAM.
# Spark wordcount gọn
rdd = sc.textFile("data.txt") # chia partition
counts = rdd.flatMap(split_words) # tách từ
.map(lambda w: (w, 1)) # cặp từ-1
.reduceByKey(add) # cộng phân tán
Ví dụ
- Input: 100MB văn bản, chạy 2 engine. Output: top-10 từ khớp 100%, tổng từ bằng nhau.
- Giải thích: 2 engine khác nhau nhưng cùng logic đếm nên kết quả khớp.
- Input: tăng worker từ 2 lên 4. Output: thời gian giảm ít nhất 30%.
- Giải thích: nhiều tay cùng đếm nên xong sớm hơn.
💻 Bài tập
Ngôn ngữ: Python 3 với multiprocessing và PySpark. Dùng khung ngày 50 và kiến thức ngày 109. Nộp vào day-133-wordcount/.
Bài 1: Wordcount 3 cách
Dữ liệu: 1 GB văn bản (ví dụ ghép nhiều file Wikipedia dump đã giải nén, hoặc lặp Gutenberg).
| Cách | Yêu cầu |
|---|---|
| Tuần tự | collections.Counter, đọc từng dòng |
| MapReduce tự viết (ngày 50) | Có combiner, 8 worker |
| PySpark | textFile -> flatMap -> map -> reduceByKey |
Kiểm tra 3 kết quả giống hệt nhau (so top 1000 và tổng số từ). In thời gian mỗi cách.
Bài 2: Shuffle và skew
- Đếm số cặp
(từ, count)đi qua shuffle khi có và không có combiner (bản tự viết). Với Spark, đọc "Shuffle Write" trong Spark UI khi dùnggroupByKeyvàreduceByKey. - Tạo dữ liệu lệch: từ "the" chiếm 30% số từ. Quan sát reducer của "the" chạy lâu nhất.
- Sửa bằng salting:
the#0tớithe#9, reduce 2 lần. So thời gian.
Bài 3: Mở rộng job (nâng cao)
- Bigram phổ biến nhất (cặp 2 từ liền nhau).
- Chỉ mục ngược có số lần xuất hiện mỗi file.
- TF-IDF cho 10.000 tài liệu bằng Spark DataFrame. So với bản
sklearntrên tập nhỏ để kiểm tra. README.md: bảng thời gian, ảnh Spark UI, giải thích nơi nghẽn.
✅ Tiêu chí hoàn thành
- 3 cách cho cùng kết quả.
- Số liệu shuffle có và không có combiner.
- Salting cải thiện thời gian với dữ liệu lệch.
- TF-IDF Spark khớp sklearn trên tập nhỏ.
❓ Câu hỏi ôn tập
- 3 bước map, shuffle, reduce mỗi bước làm gì?
- Combiner giúp giảm tải shuffle thế nào?
- Spark nhanh hơn MapReduce đĩa nhờ gì?
- Skew làm lệch tải reducer ra sao?
🌕 Bạn đã hoàn thành ngày 133. Làm hết bài tập phía trên rồi sang ngày tiếp theo.