Các ví dụ về MapReduce tốt [đã đóng]


202

Tôi không thể nghĩ ra bất kỳ ví dụ hay nào khác ngoài nhiệm vụ "cách đếm từ trong một văn bản dài với nhiệm vụ MapReduce". Tôi thấy đây không phải là ví dụ tốt nhất để tạo cho người khác ấn tượng về sức mạnh của công cụ này.

Tôi không tìm kiếm đoạn mã, thực sự chỉ là ví dụ "văn bản".


1
Tôi nghĩ một ví dụ tương tự nhưng tốt hơn nhiều là đếm từ cho tất cả các tệp văn bản bạn có trên máy tính. Dễ hiểu hơn và chứng minh sức mạnh của MapReduce.
Peter Lee

5
Trong bốn câu hỏi cuối cùng mà tôi tìm kiếm, tôi thấy chúng bị đóng là không mang tính xây dựng trên trang web này. Bởi may mắn họ đã có câu trả lời rồi. Đối với các tác giả, tôi tán thành lòng biết ơn của tôi và cho đến nay, có hơn 80 cá nhân không hiểu chính sách đóng cửa. Không phải là vấn đề với người khác nhưng tôi là một lập trình viên chuyên nghiệp từ đầu những năm 80 và đến bây giờ, tôi thấy mình đã hỏi những câu hỏi sai :)
Helder Velez

1
Rất đáng để xem qua các mẫu thiết kế của MapReduce: ví dụ: một số được trình bày trong các slide này và nhiều hơn nữa có thể được nhìn thấy trong cuốn sách này
Denis

Câu trả lời:


297

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

Đây là một bài viết trên wikipedia giải thích tất cả những gì map-reducevề

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.

Cá nhân, thấy liên kết này khá hữu ích để hiểu khái niệm

Sao chép lời giải thích được cung cấp trong blog (Trong trường hợp liên kết bị cũ)

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).


4
Một ví dụ khác là phân tích dữ liệu thời tiết từ khắp nơi trên thế giới. Tìm Max và min cho bất kỳ vùng nào. Đây là một ví dụ rất tốt.
rvphx

Tạo tất cả các bộ dữ liệu trung gian đó và sau đó kiểm tra giao lộ cho tất cả, không phải là tẻ nhạt sao? Sẽ không tốt hơn nếu chỉ tạo tất cả các cặp bạn bè có thể, như AB AC BC, v.v. và chỉ chuyển các cặp này với toàn bộ danh sách bạn bè, chỉ của hai người bạn trong cặp, đến một máy cụ thể và để nó tính toán giao điểm? Tôi đang thiếu gì ở đây?
GrowinMan

8
Nếu A truy cập hồ sơ của E thì sao? Không có (A, E) trong kết quả cuối cùng mặc dù họ có bạn chung.
Pinch

1
@Pinch đó là vì A và E không phải là bạn bè của họ. Trong trường hợp đó, cách tiếp cận này thực sự không đủ (trừ khi bạn tính đến việc A hoặc E có thể ẩn danh sách bạn bè của họ cho những người không phải bạn bè :))
Pega88

1
@karthikr: Tôi bối rối về giai đoạn nhóm. Map và Giảm rõ ràng có thể được chạy song song nhưng còn giai đoạn nhóm thì sao? Nó phải được thực hiện trong một chủ đề duy nhất hoặc tôi đang thiếu một cái gì đó?
Dinaiz

24

Một trong những ví dụ tốt nhất về việc triển khai MapReduce giống như Hadoop .

Hãy ghi nhớ rằng mặc dù chúng bị giới hạn trong các triển khai dựa trên giá trị khóa của ý tưởng MapReduce (vì vậy chúng bị hạn chế về khả năng áp dụng).


Bạn đúng rồi. Nhưng hầu hết các vấn đề trong thế giới thực là dựa trên khóa-giá trị hoặc có thể / nên được dịch sang các mô hình giá trị khóa.
Saisumanth Gopisetty

4

Một tập hợp các hoạt động quen thuộc mà bạn có thể thực hiện trong MapReduce là tập hợp các hoạt động SQL thông thường: CHỌN, CHỌN Ở ĐÂU, NHÓM THEO, ect.

Một ví dụ điển hình khác là nhân ma trận, trong đó bạn truyền một hàng M và toàn bộ vectơ x và tính một phần tử của M * x.


3

Thỉnh thoảng tôi trình bày khái niệm MR cho mọi người. Tôi thấy các tác vụ xử lý quen thuộc với mọi người và sau đó ánh xạ chúng tới mô hình MR.

Thông thường tôi có hai điều:

  1. Nhóm theo / Tập hợp. Ở đây lợi thế của giai đoạn xáo trộn là rõ ràng. Một lời giải thích rằng xáo trộn cũng được phân loại sắp xếp + một lời giải thích về thuật toán sắp xếp phân tán cũng có ích.

  2. Tham gia của hai bảng. Những người làm việc với DB đã quen thuộc với khái niệm và vấn đề về khả năng mở rộng của nó. Chỉ ra làm thế nào nó có thể được thực hiện trong MR.


to explian to non nerds tôi sử dụng phương pháp trẻ em: bạn có một đám trẻ háo hức và nhiều thẻ. bạn đưa cho mỗi đứa trẻ một số lượng thẻ bảo chúng sắp xếp chúng theo mặt sau của cỗ bài *, sau đó theo số / hình ảnh sau đó bằng bộ đồ - tức là chức năng bản đồ mỗi đứa trẻ hoàn thành và đưa đến một bộ người lớn được phân bổ hai lần một lần. mỗi người lớn "giảm" đống thành một đống, và sau đó mỗi hai người lớn đưa cho một người lớn miễn phí có ngăn xếp thẻ. đó là theo định nghĩa, hàm giảm có thể được chạy nhiều lần theo số lượng trẻ / ngăn xếp. hầu hết mọi người đều nhận được nó trong lần thử đầu tiên
Mickey Perlstein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.