MapReduce giải quyết những vấn đề gì?


61

Tôi đã đọc về MapReduce một thời gian - nhưng điều tôi không thể hiểu là làm thế nào ai đó sẽ đưa ra quyết định sử dụng (hoặc không sử dụng) MapReduce.

Ý tôi là, các mẫu vấn đề báo hiệu rằng MapReduce có thể được sử dụng là gì.

Câu trả lời:


47

Về cơ bản, đó là những vấn đề rất lớn, nhưng không khó. Nhân viên bán hàng du lịch phụ thuộc rất nhiều vào khoảng cách giữa bất kỳ cặp thành phố nào, do đó, trong khi có thể chia thành nhiều phần, kết quả một phần không thể được kết hợp lại để giải pháp tối ưu toàn cầu xuất hiện (tốt, có thể là không, nếu bạn biết cách, xin vui lòng áp dụng cho huy chương Trường của bạn bây giờ).

Mặt khác, việc đếm tần số của các từ trong một kho văn bản khổng lồ có thể phân chia tầm thường và có thể tái tổ hợp tầm thường (bạn chỉ cần thêm các vectơ được tính toán cho các phân đoạn của kho văn bản), vì vậy, giảm bản đồ là giải pháp rõ ràng.

Trong thực tế, nhiều vấn đề có xu hướng dễ dàng tái tổ hợp hơn không, do đó, quyết định có song song hóa một nhiệm vụ hay không có liên quan nhiều đến mức độ lớn của nhiệm vụ và ít hơn với mức độ khó của nó.


Nếu bạn đang tìm kiếm một câu trả lời gần đúng cho vấn đề nhân viên bán hàng du lịch, bạn có thể chọn câu trả lời một cách tầm thường với khoảng cách tối thiểu để hợp nhất.
dan_waterworth

Tôi không hiểu lời giải thích của bạn về lý do MapReduce không phù hợp với Nhân viên bán hàng du lịch.

9
Rất phù hợp để tìm giải pháp, thậm chí có thể là một giải pháp rất tốt - chỉ cần phân vùng tập hợp các thành phố thành các tập nhỏ hơn, ví dụ 1-10, 11-20, 21-30, tìm các tuyến tối ưu giữa chúng và tham gia chúng với các bước nhảy 10-> 11, 20-> 21 và 30-> 1. Nhưng vấn đề của vấn đề là tìm ra tuyến tối ưu , và không có gì đảm bảo rằng tuyến tối ưu được phân vùng theo cách này - nó thực sự có thể bắt đầu với 1-> 25! Nói cách khác, để tìm phân vùng chính xác, về cơ bản bạn phải biết giải pháp rồi! Đó là lý do tại sao việc tìm ra tuyến đường tối ưu không dễ bị lừa bởi phân vùng và lắp ráp lại
Kilian Foth

2
@KilianFoth, bạn có thể thực hiện tìm kiếm toàn diện bằng cách chia không gian giải pháp thành, bắt đầu từ 1, bắt đầu từ 2, ..., sau đó để giải quyết vấn đề tại mỗi nút này bằng cách phân vùng lại không gian theo cùng một cách. Sáp nhập ở gốc chỉ đơn giản là tìm tuyến đường ngắn nhất, sáp nhập ở một nhánh khác là tìm ra "tuyến con + tuyến ngắn nhất từ ​​nhánh đến con".
dan_waterworth

3
Trong trường hợp bạn có giải pháp, hãy nhớ rằng bạn chỉ đủ điều kiện nhận huy chương Trường nếu bạn dưới 40.
Francesco

28

Vấn đề có thể được giải quyết hiệu quả bằng cách sử dụng điện toán phân tán?

Nếu câu trả lời cho câu hỏi này là có, thì bạn có một vấn đề ứng cử viên cho MapReduce. Đó là bởi vì mô hình vấn đề cho vay để được chia thành các vấn đề nhỏ hơn bị cô lập.

Nhiệm vụ của bạn: Phân tích cuốn sách này

Một ví dụ hoạt động tốt để làm mất hiệu lực này. Bạn có một tài liệu lớn ( Moby Dick của Herman Melville ) và công việc của bạn là thực hiện phân tích tần số của tất cả các từ được sử dụng trong đó.

Cách tiếp cận tuần tự

Bạn có thể thực hiện việc này một cách tuần tự bằng cách lấy máy nhanh nhất của bạn (bạn có nhiều lời nói dối) và chạy qua văn bản từ đầu đến cuối để duy trì bản đồ băm của mỗi từ bạn tìm thấy (phím) và tăng tần số (giá trị) mỗi lần bạn phân tích một từ. Đơn giản, dễ hiểu và chậm chạp.

Cách tiếp cận MapReduce

Tiếp cận điều này từ một góc nhìn khác, bạn lưu ý rằng bạn có tất cả các máy dự phòng này nằm xung quanh và bạn có thể chia nhiệm vụ này thành nhiều phần. Cung cấp cho mỗi máy một khối văn bản 1Mb để phân tích thành bản đồ băm và sau đó đối chiếu tất cả các bản đồ băm từ mỗi bản đồ thành một kết quả duy nhất. Đây là một giải pháp MapReduce nhiều lớp.

Quá trình đọc một dòng văn bản và thu thập các từ là giai đoạn Bản đồ (bạn tạo một bản đồ đơn giản biểu thị các từ trong dòng có tần số 1,2,3, v.v.), sau đó giai đoạn Giảm là khi mỗi máy đối chiếu dòng của chúng bản đồ thành một bản đồ tổng hợp duy nhất.

Giải pháp tổng thể xuất phát từ giai đoạn Giảm hơn nữa trong đó tất cả các bản đồ tổng hợp được tổng hợp (từ đó một lần nữa) thành bản đồ cuối cùng. Hơi phức tạp hơn, song song ồ ạt và nhanh chóng.

Tóm lược

Vì vậy, để tóm tắt, nếu vấn đề của bạn cho vay được thể hiện bằng các khóa, giá trị, các thao tác tổng hợp trên các giá trị đó một cách riêng lẻ thì bạn có một vấn đề ứng cử viên cho MapReduce.


2
Meh; đó là một sự đơn giản hóa MapReduce là về phân vùng dữ liệu, áp dụng một hàm cho các phần song song mà không có giao tiếp giữa các máy phân tích , sau đó áp dụng một chức năng khác để kết hợp các bit. Không phải tất cả các vấn đề phân phối phù hợp với mô hình đó.
Donal Fellows

2
Điểm công bằng - nhưng nó đóng vai trò là một giới thiệu hữu ích và cho phép ai đó "đóng hộp" vấn đề của họ.
Gary Rowe

13

Mẫu MapReduce được lấy từ thế giới lập trình chức năng. Đó là một quá trình để áp dụng một cái gì đó gọi là sự dị hình trên cấu trúc dữ liệu song song. Các lập trình viên chức năng sử dụng catamorphism cho hầu hết các phép biến đổi hoặc tóm tắt đơn giản.

Giả sử dữ liệu của bạn là một cây, yếu tố quyết định là liệu bạn có thể tính toán một giá trị cho một nút chỉ bằng cách sử dụng dữ liệu chứa trong nút đó và các giá trị được tính cho các con của nó hay không.

Ví dụ, bạn có thể tính toán kích thước của cây bằng cách sử dụng phép biến hình; bạn sẽ tính tổng các giá trị được tính cho tất cả trẻ em cộng với một.


Câu trả lời hay, tôi không chắc liệu @good_computer có đề cập đến khung MapReduce cụ thể do Google phát triển hay không. Và tôi không biết liệu MapReduce (một lần nữa là khung Google) áp dụng cho một thứ khác ngoài các kiểu đẳng cấu cho danh sách.
Scarfridge

1
@scarfridge, tôi cho rằng OP không đề cập đến khung cụ thể của Google. Tôi đã tham khảo bài viết trên Wikipedia liên quan đến việc nó chỉ được sử dụng cho danh sách hay cho cây nói chung trước khi đăng. vi.wikipedia.org/wiki/MapReduce#Overview
dan_waterworth

2
Nếu chỉ có nó được gọi là MapFold ; điều đó sẽ dễ hiểu hơn nhiều
Aditya

6

WPI này - Các ứng dụng của Map Giảm (ppt) có thể được bạn quan tâm. Nó thảo luận về các ứng dụng khác nhau của MR và là một trong những trường hợp được thảo luận, nó cho thấy cách sử dụng 100 phiên bản EC2 và 24 giờ, New York Times có thể chuyển đổi 4TB bài viết được quét thành 1,5TB tài liệu PDF.

Một tập hợp các ví dụ khác mà MR đã giúp tăng tốc hiệu suất là: Aster - SQL Map Giảm cho thấy một số nghiên cứu tình huống về công nghệ SQL-Map Giảm bao gồm Phát hiện gian lận, Chuyển đổi và các công cụ khác.


1
Nếu bạn kết thúc với một pdf cho mỗi bài viết được quét, thì bạn chỉ đang sử dụng bản đồ phân tán, không phải MapReduce. Trong giảm bản đồ, bạn áp dụng giảm cho kết quả của bản đồ để có được một kết quả duy nhất.
Pete Kirkham

6

Map / Giảm là một hình thức cụ thể của một loại thuật toán cụ thể. Bạn sử dụng nó để chuyển đổi một tập dữ liệu khổng lồ thành tập dữ liệu khác. (Tập dữ liệu kết quả có thể có hoặc không lớn.) Nếu bạn không muốn thiết lập đầu ra dữ liệu tĩnh là kết quả của đầu vào dữ liệu tĩnh, thì Map / Giảm là không phù hợp. Map / Giảm có thể dễ dàng cho bạn biết có bao nhiêu John Smith trong danh bạ điện thoại Manhattan, nhưng nó không phù hợp để xây dựng một máy chủ web.

Cách thức Map / Giảm hoạt động là:

  • Bản đồ lấy các cặp khóa (k1) và giá trị (v1) và ánh xạ chúng thành một bộ khóa mới (k2) và giá trị (v2).
  • Giảm lấy tất cả các giá trị v2 với cùng khóa k2 và tạo ra một giá trị mới (v3).

Kết quả là một danh sách các cặp (k1, v1) được chuyển thành một danh sách (v3) s. (Tất nhiên, giá trị "v3" có thể là một hỗn hợp bao gồm k2, có thể được xác định bằng với k1.)

Vì vậy, bạn sử dụng nó:

  1. Nếu bạn có quá nhiều dữ liệu để bắt đầu, việc chạy tất cả tuần tự thông qua một hoặc hai máy chủ sẽ mất quá nhiều thời gian và

  2. Bạn có thể hình dung dữ liệu đầu ra là một danh sách các cặp giá trị hoặc cặp giá trị khóa (thường không quá khó khi bạn nhớ "khóa" chỉ có nghĩa là "nhãn duy nhất") và

  3. Dù là mối quan hệ nào, bạn chắc chắn rằng mỗi phần dữ liệu đầu vào chỉ tác động đến giá trị đầu ra cho một khóa đầu ra.

Nếu tất cả dữ liệu của bạn có thể được xử lý tuần tự bởi một máy chủ, thì đó là mô hình điện toán chiếm ưu thế (các máy chủ được xây dựng và lập trình viên được đào tạo), hãy sử dụng một máy chủ.

Giai đoạn bản đồ phải phân vùng tất cả dữ liệu đầu vào bằng phím đầu ra. Nó không phải tạo ra giá trị đầu ra được liên kết với khóa đầu ra (được thực hiện bởi giai đoạn giảm), nhưng nó phải chỉ định duy nhất mỗi cặp giá trị khóa đầu vào để đóng góp tối đa một giá trị của khóa đầu ra. Nếu dữ liệu quá liên quan đến nhau thì bản đồ giảm có thể không thể xử lý vấn đề. Mặt khác, có thể bạn cần sử dụng nhiều vòng bản đồ / thu nhỏ.

Nếu bạn không thể tìm ra cách biến đổi dữ liệu của mình thành bản đồ / thu nhỏ, thì tất nhiên đó không phải là một giải pháp.

Có một nghệ thuật thực sự để tìm ra nếu một vấn đề có thể được phân tách thành một cái gì đó mà Map / Giảm có thể xử lý. Ví dụ v1 và v2 có thể không có trong bộ dữ liệu đầu vào hoặc đầu ra. Nếu bạn chỉ muốn đếm các mục duy nhất trong dữ liệu đầu vào, thì k1 = k2 = một mục và v1 = v2 = 1 hoặc 0 hoặc thực sự bất cứ điều gì. Giảm chỉ tạo ra v3 là tổng của số k2 đã được đưa ra.

Vì vậy, thật khó để nói chắc chắn rằng việc chuyển đổi dữ liệu có thể được thực hiện bằng Map / Giảm, nhưng ở trên cung cấp cho bạn một số hướng dẫn.


3

MapReduce hoạt động trên bất kỳ vấn đề nào được tạo thành từ chính xác 2 hàm ở một mức độ trừu tượng nào đó. Hàm đầu tiên được áp dụng cho từng mục trong bộ đầu vào và hàm thứ hai tổng hợp kết quả.

Vì vậy, bất cứ khi nào bạn muốn nhận (1) kết quả từ (n) đầu vào và tất cả các đầu vào có thể được kiểm tra / sử dụng bởi hàm (1), bạn có thể sử dụng MapReduce. Một lần nữa, đây là ở một mức độ trừu tượng cụ thể. Hàm (1) có thể là một số chức năng nhóm để kiểm tra đầu vào và quyết định sử dụng chức năng nào trong số các chức năng khác.

Điều này hữu ích khi bạn không biết trước mình sẽ có bao nhiêu đầu vào, khi bạn cần chia sẻ "đơn vị" công việc kín đáo hoặc khi bạn muốn một lần hoàn trả đại diện cho toàn bộ kết quả (IE chạy năm nghìn bài kiểm tra đơn vị và nếu ít hơn x% thất bại, trả về thành công).


3

Hầu hết các câu trả lời ở đây dường như là một số biến thể của việc giải thích những gì bản đồ giảm, điều này là hợp lệ. Nhưng để trả lời câu hỏi, đó là mẫu nào sẽ báo hiệu nơi bạn có thể sử dụng bản đồ thu nhỏ không thực sự được giải quyết bởi điều đó.

Nếu sự ngây thơ, không có chức năng, việc thực hiện vấn đề mà bạn đang xem xét liên quan đến việc lặp lại một cái gì đó và sau đó cập nhật một cái gì đó bên ngoài vòng lặp với một số trạng thái từ bên trong vòng lặp, thì rất có thể bạn có một cái gì đó giúp bản đồ giảm bớt. Đặc biệt là nếu bạn có thể khái quát việc cập nhật trạng thái trung tâm thành một hàm hoạt động chỉ với hai tham số và có thể đảm bảo chức năng này là giao hoán và kết hợp.

Lý do bạn có thể muốn sử dụng giảm bản đồ nếu điều đó đúng là hai lần: 1) nó có thể sạch hơn và dễ kiểm tra và gỡ lỗi hơn nếu bạn phá vỡ mọi thứ thành bản đồ và giảm các chức năng. 2) các chức năng giảm bản đồ là không trạng thái và có thể được chạy đồng thời, giúp tăng tốc mọi thứ nếu bạn có sẵn nhiều cpus và một cái gì đó như hadoop hoặc spark sử dụng điều đó để chạy mọi thứ trong một cụm.

Điều này thật tuyệt nếu bạn đang lặp đi lặp lại nhiều thứ nhưng số dặm của bạn có thể thay đổi tùy thuộc vào mức độ phức tạp của bản đồ / mức giảm của bạn. Nó khá phổ biến để kết thúc với một chuỗi tuần tự hoặc cây giảm bản đồ trong đó cuối cùng mọi thứ vẫn bị tắc nghẽn trong một số bước giảm phức tạp ở cuối chuỗi. Ví dụ, nhiều thuật toán đồ thị rất khó để mở rộng hiệu quả chỉ với bản đồ thu nhỏ.

Ví dụ đơn giản nhất hoạt động tốt với giảm bản đồ, là đếm thứ, đây là mức giảm rất rẻ. Đây là lý do tại sao đếm từ là một ví dụ thường được sử dụng để giảm bản đồ. Bạn có thể mong đợi khả năng mở rộng tuyến tính cho hiệu năng với usecase đó: mọi cpu bạn thêm vào đều làm cho nó nhanh hơn.


2

Nếu bạn thực hiện nhiều chương trình chức năng, bạn bắt đầu gặp phải các tình huống cần có bản đồ chung và giảm bớt. Bạn thậm chí có thể nhìn thấy chúng trong lập trình bắt buộc, nhưng đừng nhận ra chúng đằng sau mặt nạ của các vòng lặp và bộ tích lũy.

Như một ví dụ về một thứ xuất hiện cho tôi gần đây, tôi đã làm việc với một trình phân tích cú pháp trong Haskell. Để kiểm tra trình phân tích cú pháp của tôi, tôi bơm một danh sách các đoạn chuỗi thông qua trình phân tích cú pháp và sau đó tôi muốn lấy một chuỗi mà tôi có thể xuất kết quả của mình để xem nó có phân tích cú pháp đúng không. Nó trông giống như:

--my initial set of test data, a list
tests = ["string1", "string2", "string3", ...]

--Map Step: turn strings into parsed results
--note the type, which demonstrates the map
applyParser :: [String] -> [Token]
--The actual function
applyParser input = map parser input

--Second map, turn tokens into output
showTokens :: [Token] -> [String]
showTokens t = map show t

--Reduce step, concat the results
combineResults :: [String] -> String
--In haskell, reduce is the foldl function, which takes an operation to fold with, a starting element, and a list to fold on
combineResults strings = foldl concat "" strings

--Finished program
testParser = print (combineResults(showTokens(applyParser tests)))

Tất nhiên, đây chỉ là sư phạm. Mã thực tế của tôi trông hơi khác một chút và sử dụng nhiều chức năng nội bộ hơn (như fold concatkhông cần thiết vì Haskell đã bao gồm unlinesđiều đó [String]->String). Điểm chính của tôi là tôi đã không lường trước được việc sử dụng bản đồ / thu nhỏ khi tôi bắt đầu, nó chỉ phù hợp với nhu cầu của tôi. Tôi muốn làm một số thứ với danh sách, sau đó biến danh sách của tôi thành một yếu tố đầu ra duy nhất. Việc sử dụng bản đồ / giảm nổi lên một cách tự nhiên.

Xử lý chuỗi (như phân tích cú pháp) là một cách sử dụng rất rõ ràng để giảm bản đồ, ánh xạ là ứng dụng của các biến đổi khác nhau trên văn bản đầu vào và giảm nó đưa văn bản kết quả trở lại với nhau như đầu ra. Tương tự như vậy, một trình biên dịch có thể tương tự, sử dụng các nếp gấp để biến một luồng các phần tử Cây Cú pháp Trừu tượng thành một hình thức tốt hơn (tối ưu hóa).


1

Có song song không?

Bất kỳ vấn đề song song nào về cơ bản là bản đồ và gấp; ngược lại, bước bản đồ vốn có thể song song (và bước gấp có thể, tùy thuộc vào cấu trúc mà nó gấp lại), vì vậy đây là thuộc tính hai chiều.


3
Đây chỉ là trường hợp cho các vấn đề song song đáng xấu hổ . Có rất nhiều vấn đề rất song song, nhưng chứa đủ sự tương tác giữa các yếu tố mà MapReduce đơn giản sẽ không hiệu quả.
Đánh dấu gian hàng

cảm ơn về liên kết, tôi đã không biết về thuật ngữ paralell ngượng ngùng. không phải tất cả các bản đồ đều làm giảm các vấn đề có thể giải quyết được.
Paul Sanwald

1
Có nhiều vấn đề song song lúng túng, không phải tất cả đều cần phần giảm.
Donal Fellows

1

Giả sử bạn đang tìm kiếm một cụm máy chủ và người ta không thể phản hồi tại thời điểm đó. Những gì mapReduce sẽ làm là vì nó không thể truy cập nút cây đó vào Bản đồ lớn hơn nên nó sẽ lên lịch lại cho lần sau và thực hiện Bản đồ hoặc Giảm sau đó. Về cơ bản, nó cố gắng đảm bảo tất cả thông tin có sẵn với sự khó đoán của phần mềm và phần cứng trong môi trường.


1

Đây là những câu hỏi chính tôi sử dụng để thăm dò quyết định sử dụng (hoặc không sử dụng) MapReduce.

  • Việc đạt được hiệu suất thực thi song song hợp lý với nỗ lực lập trình tối thiểu có quan trọng đối với một vấn đề nhất định không?
  • Tôi có sẵn số lượng lớn (hàng trăm) phần tử thực thi song song không?
  • Có băng thông / thông lượng truyền thông tuyệt vời giữa các yếu tố thực hiện song song?
  • Tôi có cần xử lý một lượng lớn dữ liệu (TB) không?
  • Có phải vấn đề tôi đang cố gắng giải quyết phân rã thành Bản đồ và Giảm hoạt động không?

    • Bản đồ: Thực hiện thao tác tương tự trên tất cả dữ liệu.
    • Giảm: Thực hiện thao tác tương tự trên từng nhóm dữ liệu do Map tạo ra.

1

thực tế, đó là một mô hình "phân chia và chinh phục" chung chung, để các giải pháp phân phối tính toán có thể được viết một cách khái quát.

một ví dụ đơn giản giống như một tài liệu lớn. vấn đề là bạn muốn đếm số lượng chữ cái trong tài liệu đó. thay vì chạy trên một máy đơn lẻ, bạn có thể chia nó thành một mảng gồm tất cả các từ trong tài liệu. sau đó bạn có thể xử lý từng từ riêng lẻ và kết quả lại với nhau.

mẫu này rất hữu ích, vì một khi bạn có được một bản đồ chung / giảm việc thực hiện, bạn có thể giải quyết bất kỳ vấn đề nào bằng cách sử dụng cùng một lớp phần mềm đó, bạn chỉ cần thể hiện vấn đề của mình theo cách đó.

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.