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ì.
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:
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ó.
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.
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.
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.
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à:
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ó:
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à
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à
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.
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).
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.
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 concat
khô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).
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.
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.
Đâ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.
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?
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 đó.