MapReduce - Xử lý dữ liệu phân tán
- 7 minsNội dung
Giới thiệu tổng quan
Trong bài viết trước mình đã giới thiệu về HDFS - Hệ thống File phân tán (bạn có thể xem lại tại đây). Với HDFS chúng ta có được một hệ thống có khả năng lưu trữ dữ liệu vô hạn (không bị phụ thuộc vào phần cứng). Để xử lý được lượng dữ liệu cực lớn, lưu trữ phân tán trên các node của HDFS, chúng ta cần một phương pháp tính toán gọi là MapReduce.
Dữ liệu thay vì được tập trung lại một node để xử lý (tốn nhiều chi phí, bất khả thi) thì chương trình MapReduce sẽ được gửi đến các node đang có dữ liệu và sử dụng tài nguyên của chính node đó cho việc tính toán và lưu trữ kết quả. Toàn bộ quá trình này được thực hiện tự động, người dùng (lập trình viên) chỉ cần định nghĩa 2 hàm Map và Reduce:
- map: là hàm biến đổi, nhận đầu vào là một cặp <Key, Value> và cần trả về 1 hoặc nhiều cặp <Key, Value> mới.
- reduce: là hàm tổng hợp, nhận đầu vào là cặp <Key, Value[]> trong đó list values đầu vào chứa tất cả các value có cùng key và cần trả về 1 cặp <Key, Value> kết quả.
Bài toán WordCount
Đề bài: Cho một file dữ liệu (log) được lưu trữ trên HDFS, đếm số lần 1 từ xuất hiện trong file và ghi kết quả trên HDFS. Mỗi từ cách nhau bởi dấu cách.
Mã giả
Trong chương trình này, hàm map sẽ chia văn bản đầu vào thành các từ, với mỗi từ tách ra được sẽ trả về một cặp từ cùng số đếm 1. Hàm reduce nhận đầu vào là từ cùng danh sách tất cả số đếm của từ đó, nó sẽ thực hiện tính tổng số đếm để được số lần xuất hiện của từ đó.
Cài đặt và chạy trên Hadoop cluster
Mình sẽ sử dụng các docker container đã build từ bài viết này để cài đặt và thử nghiệm chương trình WordCount.
Start HDFS
root@node01:~# $HADOOP_HOME/sbin/start-dfs.sh
Tạo 1 file trên HDFS làm input cho bài toán Wordcount
root@node01:~# hdfs dfs -D dfs.replication=2 -appendToFile /lib/hadoop/logs/*.log /input_wordcount.log
Source code Java
Lưu file với tên file
WordCount.java
trong thư mục wordcount
Bổ sung biến môi trường
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
Compile code
root@node01:~/wordcount# hadoop com.sun.tools.javac.Main WordCount.java
root@node01:~/wordcount# jar cf wc.jar WordCount*.class
Chạy và kiểm tra kết quả
root@node01:~/wordcount# hadoop jar wc.jar WordCount /input_wordcount.log /ouput_wordcount
root@node01:~/wordcount# hdfs dfs -cat /ouput_wordcount/part-r-00000
"script". 1
#1 10
#110 1
#129 1
...
Sơ lược hoạt động trong chương trình MapReduce
Quá trình thực thi chương trình MapReduce có thể tóm tắt lại trong các giai đoạn sau:
- Init: Một
ApplicationMaster
(AM) được khởi tạo và duy trì cho đến khi chương trình kết thúc, nhiệm vụ của nó là quản lý điều phối các task thực thi trên các node. Chúng ta sẽ tìm hiểu kỹ hơn về AM trong bài viết sau. - Map: AM xác định các node có dữ liệu đầu vào trên HDFS và yêu cầu chúng thực hiện việc biến đổi dữ liệu đầu vào theo chỉ dẫn được người dùng viết trong hàm
map
- Shuffle and Sort: Các cặp <Key, Value> kết quả từ hàm
map
sẽ được trộn giữa các node và sắp xếp theo key. Các cặp <Key, Value> có cùng key sẽ được gom nhóm lại với nhau. - Reduce: Trong giai đoạn này, các cặp <Key, Value> cùng key sẽ được xử lý theo chỉ dẫn được viết trong hàm
reduce
để ra được kết quả cuối cùng.
Khi xử lý những dữ liệu có khối lượng lớn, AM sẽ tạo ra nhiều task (mỗi task xử lý một block) và thực thi chúng trên nhiều node khác nhau để tăng hiệu năng. Nếu trong quá trình chạy có 1 node bị hỏng, AM sẽ chuyển các task của node đó sang thực thi trên node khác mà không làm ảnh hưởng đến các task khác và toàn bộ chương trình.
Kết luận
Qua bài viết này mình đã giới thiệu những vấn đề cơ bản nhất về mô hình tính toán MapReduce thông qua ví dụ với bài toán Wordcount. Bạn có thể tìm hiểu thêm về MapReduce trong bài báo này của Google. Hẹn gặp lại trong các bài viết sau!