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

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áchYêu cầu
Tuần tựcollections.Counter, đọc từng dòng
MapReduce tự viết (ngày 50)Có combiner, 8 worker
PySparktextFile -> 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

  1. Đế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ùng groupByKey và reduceByKey.
  2. 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.
  3. Sửa bằng salting: the#0 tới the#9, reduce 2 lần. So thời gian.

Bài 3: Mở rộng job (nâng cao)

  1. Bigram phổ biến nhất (cặp 2 từ liền nhau).
  2. Chỉ mục ngược có số lần xuất hiện mỗi file.
  3. TF-IDF cho 10.000 tài liệu bằng Spark DataFrame. So với bản sklearn trên tập nhỏ để kiểm tra.
  4. 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.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.