Giải thích map-reduce bằng MongoDB
MapReduce
5
mongodb
11
White

Ngoc Dao viết ngày 20/03/2016

Khoảng 5, 7 năm nay NOSQL là đề tài rất nóng bỏng. SQL phổ biến thì chỉ có khoảng vài ba cái như PostgreSQL, MySQL, MS SQL, Oracle nói chung na na như nhau vì có chung chuẩn. Còn NOSQL thì không phải cái nào cũng giống nhau. Mỗi cái có tập hợp các tính năng đặc sắc riêng, ngoài ra NOSQL vì đơn giản dễ làm nên chỉ mới vài ba năm mà chẳng mấy chốc đã có hàng chục cái ra đời, nên chọn cái nào để dùng không phải là chuyện dễ, cần có kinh nghiệm mới đánh giá và đưa ra được lựa chọn thích hợp với yêu cầu của từng project. Một trong những các để dễ nắm bắt, có cách là qui chúng lên đoạn thẳng nằm giữa 2 thái cực: table (số cột cố định) và document (số cột không cố định).

Lập trình viên chắc đều quen thuộc với những lệnh truy xuất dữ liệu như SELECT, COUNT, GROUP BY, DISTINCT v.v. Nhưng NOSQL không phải là SQL, thường không cung cấp những lệnh phức tạp như SQL. Thay vào đó, nói chung các NOSQL đều cung cấp tính năng map-reduce để lập trình viên dùng khi muốn truy xuất phức tạp.

Bài viết này dùng MongoDB làm ví dụ để tóm tắt nguyên lí hoạt động của map-reduce.

MongoDB nằm ở thái cực document. Tập hợp nhiều document gọi là collection. Ví dụ collection access_logs chứa các document có dạng:

...
{user_id: 1, accessed_at: "2010/12/31 08:05:01"}
{user_id: 2, accessed_at: "2010/12/31 08:12:16"}
{user_id: 1, accessed_at: "2010/12/31 08:15:07"}
...

Viết dấu {} ý là các document có thể không luôn luôn có cùng là 2 phần tử. Có thể hiểu document là hash.

Tính năng map-reduce hoạt động trên collection, có 2 bước là map và reduce.

Map

Hàm map nhận tham số là document. Bên trong hàm map có thể gọi nhiều lần (hoặc không gọi cũng được) hàm emit(key, document mới). Key có thể là giá trị đơn hoặc document.

Áp hàm map lên collection sẽ tạo ra bảng có 2 cột là (key, document mới).

...
key1 document1
key2 document2
key1 document3
key2 document4
key1 document5
...

Hàm map ở đây hơi khác với hàm map trong các ngôn ngữ như Ruby, Erlang, Scala. Trong các ngôn ngữ trên, hàm map biến đổi tập hợp này thành tập kia có cùng số lượng phần tử (1 đối 1). Còn hàm map ở đây tạo ra bảng có số phần tử có thể khác số phần tử của collection.

Reduce

Các phần tử trong bảng được group lại theo key.

...
key1 [document1, document3, document5]
key2 [document2, document4]
...

Hàm reduce(key, values) trả về document gì đó. Áp hàm reduce lên bảng trên sẽ được bảng mới có cùng số phần tử.

...
key1 document6
key2 document7
...

Như vậy, khi sử dụng tính năng map-reduce lập trình viên truyền cho MongoDB 2 hàm map và reduce, MongoDB sẽ trả về bảng trên.

Ví dụ

Với access_logs như trên, giả sử muốn đếm xem từng user mỗi user access bao nhiêu lần, ta truyền cho MongoDB:

map = function() {
emit(this.user_id, null);
}

reduce = function(user_id, values) {
return {count: values.length};
}

MongoDB sẽ trả về collection có dạng:

...
{_id: 1, value: {count: 2}}
{_id: 2, value: {count: 1}}
...

Mặc dù nguyên lí chỉ đơn giản như vậy, nhưng vì bên trong hàm map và reduce lập trình viên tự do viết gì cũng được, nên chịu khó suy nghĩ một chút là làm được rất nhiều trò, tái hiện được không kém tính năng của các lệnh SQL. Ví dụ để ý kích thước collection trên chính là số unique user đã access.

Đọc thêm

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
252 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
56 6
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết 2 năm trước
56 6
White
32 0
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết gần 2 năm trước
32 0
White
28 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết gần 2 năm trước
28 1
Bài viết liên quan
Male avatar
38 7
Giới thiệu MongoDB là một giải pháp nosql database. Data được lưu ở dạng các bson document. Hỗ trợ vertical scaling và horizontal scaling, dynamic...
manhdung viết hơn 2 năm trước
38 7
White
10 0
Hadoop là cái gì vậy? “Hadoop là một framework nguồn mở viết bằng Java cho phép phát triển các ứng dụng phân tán có cường độ dữ liệu lớn một cách ...
nguyenduyhao1111 viết hơn 1 năm trước
10 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
252 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!