Bản đồ thu nhỏ là một khung được phát triển để xử lý lượng dữ liệu khổng lồ một cách hiệu quả. Ví dụ: nếu chúng ta có 1 triệu bản ghi trong một tập dữ liệu và nó được lưu trữ trong một biểu diễn quan hệ - sẽ rất tốn kém để lấy các giá trị và thực hiện bất kỳ loại biến đổi nào trên chúng.
Ví dụ Trong SQL, đưa ra Ngày sinh, để tìm hiểu có bao nhiêu người ở độ tuổi> 30 cho một triệu hồ sơ sẽ mất một thời gian và điều này sẽ chỉ tăng theo thứ tự độ lớn khi độ phức tạp của truy vấn tăng. Map Giảm cung cấp triển khai dựa trên cụm trong đó dữ liệu được xử lý theo cách phân tán
Một ví dụ điển hình khác là Tìm kiếm bạn bè thông qua bản đồ thu nhỏ có thể là một ví dụ mạnh mẽ để hiểu khái niệm và trường hợp sử dụng được sử dụng tốt.
Tìm bạn
MapReduce là một khung ban đầu được phát triển tại Google, cho phép dễ dàng tính toán phân tán quy mô lớn trên một số lĩnh vực. Apache Hadoop là một triển khai mã nguồn mở.
Tôi sẽ trình bày chi tiết, nhưng nó đi xuống để xác định hai chức năng: chức năng bản đồ và chức năng thu nhỏ. Hàm ánh xạ lấy một giá trị và khóa đầu ra: cặp giá trị. Chẳng hạn, nếu chúng ta xác định hàm ánh xạ lấy một chuỗi và xuất độ dài của từ làm khóa và chính từ đó là giá trị thì ánh xạ (steve) sẽ trả về 5: steve và map (savannah) sẽ trả về 8: savannah . Bạn có thể nhận thấy rằng hàm bản đồ là không trạng thái và chỉ yêu cầu giá trị đầu vào để tính giá trị đầu ra của nó. Điều này cho phép chúng ta chạy chức năng bản đồ theo các giá trị song song và cung cấp một lợi thế rất lớn. Trước khi chúng ta có được hàm giảm, khung công tác mapreduce sẽ nhóm tất cả các giá trị lại với nhau bằng khóa, do đó, nếu các hàm ánh xạ xuất ra cặp khóa: value sau:
3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research
Họ được nhóm lại thành:
3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]
Mỗi dòng này sau đó sẽ được truyền dưới dạng đối số cho hàm less, hàm chấp nhận khóa và danh sách các giá trị. Trong trường hợp này, chúng tôi có thể đang cố gắng tìm ra có bao nhiêu từ có độ dài nhất định tồn tại, do đó, hàm giảm của chúng tôi sẽ chỉ đếm số lượng mục trong danh sách và xuất khóa với kích thước của danh sách, như:
3 : 3
4 : 3
5 : 2
8 : 2
Việc cắt giảm cũng có thể được thực hiện song song, một lần nữa cung cấp một lợi thế rất lớn. Sau đó chúng ta có thể nhìn vào các kết quả cuối cùng này và thấy rằng chỉ có hai từ có độ dài 5 trong kho văn bản của chúng tôi, v.v ...
Ví dụ phổ biến nhất của mapreduce là để đếm số lần các từ xuất hiện trong một kho văn bản. Giả sử bạn có một bản sao của Internet (Tôi đã may mắn làm việc trong tình huống như vậy) và bạn muốn có một danh sách mỗi từ trên internet cũng như số lần xảy ra.
Cách bạn sẽ tiếp cận điều này sẽ là token hóa các tài liệu bạn có (chia nó thành các từ) và chuyển từng từ cho một người lập bản đồ. Người vẽ bản đồ sau đó sẽ nhổ từ trở lại cùng với giá trị là 1
. Giai đoạn nhóm sẽ lấy tất cả các phím (trong trường hợp này là từ) và tạo danh sách 1 '. Giai đoạn rút gọn sau đó lấy một khóa (từ) và danh sách (danh sách 1 cho mỗi lần khóa xuất hiện trên internet) và tính tổng danh sách. Bộ giảm tốc sau đó xuất ra từ, cùng với số đếm. Khi tất cả được nói và thực hiện, bạn sẽ có một danh sách mỗi từ trên internet, cùng với số lần nó xuất hiện.
Dễ thôi phải không? Nếu bạn đã từng đọc về mapreduce, kịch bản trên không có gì mới ... đó là "Xin chào, Thế giới" của mapreduce. Vì vậy, đây là trường hợp sử dụng trong thế giới thực (Facebook có thể hoặc không thực sự làm như sau, đây chỉ là một ví dụ):
Facebook có một danh sách bạn bè (lưu ý rằng bạn bè là một thứ hai chiều trên Facebook. Nếu tôi là bạn của bạn, bạn là của tôi). Họ cũng có rất nhiều dung lượng đĩa và họ phục vụ hàng trăm triệu yêu cầu mỗi ngày. Họ đã quyết định tính toán trước khi có thể để giảm thời gian xử lý yêu cầu. Một yêu cầu xử lý chung là tính năng "Bạn và Joe có 230 bạn chung". Khi bạn truy cập hồ sơ của ai đó, bạn sẽ thấy một danh sách bạn bè mà bạn có chung. Danh sách này không thay đổi thường xuyên nên sẽ rất lãng phí khi tính toán lại mỗi khi bạn truy cập hồ sơ (chắc chắn bạn có thể sử dụng chiến lược lưu trữ hợp lý, nhưng sau đó tôi sẽ không thể tiếp tục viết về mapreduce cho vấn đề này). Chúng tôi sẽ sử dụng mapreduce để chúng tôi có thể tính toán mọi người ' bạn bè chung một lần một ngày và lưu trữ những kết quả đó. Sau đó, nó chỉ là một tra cứu nhanh chóng. Chúng tôi đã có rất nhiều đĩa, nó rẻ.
Giả sử bạn bè được lưu trữ dưới dạng Người -> [Danh sách bạn bè], danh sách bạn bè của chúng tôi là:
A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D
Mỗi dòng sẽ là một đối số cho một người lập bản đồ. Đối với mỗi người bạn trong danh sách bạn bè, người lập bản đồ sẽ xuất một cặp khóa-giá trị. Chìa khóa sẽ là một người bạn cùng với người đó. Giá trị sẽ là danh sách bạn bè. Khóa sẽ được sắp xếp sao cho các bạn theo thứ tự, khiến tất cả các cặp bạn bè đi đến cùng một bộ giảm tốc. Điều này thật khó để giải thích bằng văn bản, vì vậy hãy thực hiện và xem bạn có thể xem mẫu không. Sau khi tất cả các trình ánh xạ đã chạy xong, bạn sẽ có một danh sách như thế này:
For map(A -> B C D) :
(A B) -> B C D
(A C) -> B C D
(A D) -> B C D
For map(B -> A C D E) : (Note that A comes before B in the key)
(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :
(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :
(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):
(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:
(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)
Mỗi dòng sẽ được truyền dưới dạng đối số cho bộ giảm. Hàm giảm sẽ chỉ đơn giản là giao các danh sách các giá trị và xuất cùng khóa với kết quả của giao. Ví dụ: giảm ((AB) -> (ACDE) (BCD)) sẽ xuất ra (AB): (CD) và có nghĩa là bạn bè A và B có C và D là bạn chung.
Kết quả sau khi giảm là:
(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)
Bây giờ khi D truy cập hồ sơ của B, chúng tôi có thể nhanh chóng tra cứu (B D)
và thấy rằng họ có ba người bạn chung , (A C E)
.