Mục đích của giai đoạn xáo trộn và sắp xếp trong bộ rút gọn trong Lập trình rút gọn bản đồ là gì?


113

Trong lập trình Map Reduce, giai đoạn giảm có xáo trộn, sắp xếp và giảm bớt như các phần con của nó. Sắp xếp là một công việc tốn kém.

Mục đích của giai đoạn xáo trộn và sắp xếp trong bộ rút gọn trong Lập trình rút gọn bản đồ là gì?


3
Tôi luôn cho rằng điều này là cần thiết vì đầu ra từ trình ánh xạ là đầu vào cho bộ giảm tốc, vì vậy nó được sắp xếp dựa trên không gian khóa và sau đó được chia thành các nhóm cho mỗi đầu vào bộ giảm tốc.
BasicHorizon

Câu trả lời:


171

Trước hết shufflinglà quá trình truyền dữ liệu từ bộ lập bản đồ đến bộ giảm tải, vì vậy tôi nghĩ rõ ràng rằng nó là cần thiết cho bộ rút gọn, vì nếu không, họ sẽ không thể có bất kỳ đầu vào nào (hoặc đầu vào từ mọi trình lập bản đồ) . Việc xáo trộn có thể bắt đầu ngay cả trước khi giai đoạn bản đồ kết thúc, để tiết kiệm thời gian. Đó là lý do tại sao bạn có thể thấy trạng thái giảm lớn hơn 0% (nhưng nhỏ hơn 33%) khi trạng thái bản đồ chưa phải là 100%.

Sortingtiết kiệm thời gian cho bộ giảm tốc, giúp nó dễ dàng phân biệt khi nào một tác vụ giảm mới nên bắt đầu. Nó chỉ đơn giản là bắt đầu một tác vụ giảm mới, khi khóa tiếp theo trong dữ liệu đầu vào được sắp xếp khác với khóa trước đó, nói một cách đơn giản. Mỗi tác vụ rút gọn lấy một danh sách các cặp khóa-giá trị, nhưng nó phải gọi phương thức Reduce () lấy đầu vào là khóa-danh sách (giá trị), vì vậy nó phải nhóm các giá trị theo khóa. Thật dễ dàng để làm như vậy, nếu dữ liệu đầu vào được sắp xếp trước (cục bộ) trong giai đoạn bản đồ và chỉ cần hợp nhất được sắp xếp trong giai đoạn thu gọn (vì bộ giảm tải lấy dữ liệu từ nhiều người lập bản đồ).

Partitioning, mà bạn đã đề cập trong một trong các câu trả lời, là một quá trình khác. Nó xác định cặp rút gọn (khóa, giá trị) nào, đầu ra của giai đoạn bản đồ, sẽ được gửi. Trình phân vùng mặc định sử dụng hàm băm trên các khóa để phân phối chúng cho các tác vụ thu gọn, nhưng bạn có thể ghi đè nó và sử dụng Trình phân vùng tùy chỉnh của riêng bạn.

Một nguồn thông tin tuyệt vời cho các bước này là hướng dẫn Yahoo này .

Một đại diện đồ họa đẹp của điều này như sau (xáo trộn được gọi là "bản sao" trong hình này):

nhập mô tả hình ảnh ở đây

Lưu ý rằng shufflingvà hoàn toàn sortingkhông được thực hiện nếu bạn chỉ định bộ giảm không (setNumReduceTasks (0)). Sau đó, công việc MapReduce dừng lại ở giai đoạn bản đồ và giai đoạn bản đồ không bao gồm bất kỳ loại sắp xếp nào (vì vậy ngay cả giai đoạn bản đồ cũng nhanh hơn).

CẬP NHẬT: Vì bạn đang tìm kiếm thứ gì đó chính thức hơn, bạn cũng có thể đọc cuốn sách "Hadoop: The Definitive Guide" của Tom White. Đây là phần thú vị cho câu hỏi của bạn.
Tom White là người cam kết Apache Hadoop từ tháng 2 năm 2007 và là thành viên của Tổ chức phần mềm Apache, vì vậy tôi đoán nó khá đáng tin cậy và chính thức ...


"Sắp xếp giúp tiết kiệm thời gian cho bộ giảm, giúp nó dễ dàng phân biệt khi nào một tác vụ giảm mới sẽ bắt đầu. Nó chỉ bắt đầu một tác vụ giảm mới khi khóa tiếp theo trong dữ liệu đầu vào được sắp xếp khác với khóa trước, nói một cách đơn giản." Tôi không hiểu phần này. Người lập bản đồ sử dụng một trình phân vùng để phân chia vùng tràn vào các phân vùng cục bộ, mỗi phân vùng sau đó gửi đến một phần giảm. Làm thế nào sắp xếp giúp ở đây?
MaxNevermind

1
@MaxNevermind Nếu bạn có x giảm tác vụ (phân vùng), điều đó không có nghĩa là bạn sẽ gọi phương thức Reduce () x lần. Nó sẽ được gọi một lần cho mỗi khóa riêng biệt. Vì vậy, một tác vụ giảm có thể gọi phương thức Reduce () nhiều lần.
vefthym

"Nó sẽ được gọi một lần cho mỗi khóa riêng biệt" Tại sao? Mapper tạo thành các phân vùng theo bất kỳ cách nào nó muốn (không cần thiết một phân vùng cho mọi khóa riêng biệt), sau đó mỗi phân vùng chuyển sang trình giảm thiểu, có sai không?
MaxNevermind

1
@MaxNevermind Mapper xuất ra các khóa và giá trị, nó không tạo thành phân vùng. Các phân vùng được xác định bởi số lượng tác vụ giảm mà người dùng xác định và việc thực hiện Phân vùng. Kết quả đầu ra của tất cả Người lập bản đồ có cùng khóa sẽ đến cùng một phương thức Reduce (). Điều này không thể thay đổi. Nhưng điều thể thay đổi là những khóa khác (nếu có) sẽ được đặt trong cùng một phân vùng và do đó, sẽ được xử lý bởi cùng một tác vụ. Một tác vụ giảm có thể gọi hàm giảm () nhiều hơn một lần, nhưng chỉ một lần cho mỗi phím.
vefthym

2
được rồi, tôi nghĩ tôi đã hiểu. Vấn đề của tôi là tôi đã quên rằng giảm có danh sách các giá trị làm đối số không chỉ là một cặp khóa-giá trị. Tôi nghĩ bạn nên giải thích rõ điều này trong câu trả lời của mình: "Mỗi tác vụ rút gọn lấy một danh sách các cặp khóa-giá trị nhưng nó phải gọi phương thức rút gọn lấy một khóa-Danh sách <giá trị>, vì vậy nó phải nhóm các giá trị theo khóa, thật dễ dàng phải làm gì nếu dữ liệu đầu vào được trước được sắp xếp trong một giai đoạn mapper"
MaxNevermind

42

Hãy xem lại các giai đoạn chính của chương trình Mapreduce.

Các giai đoạn bản đồ được thực hiện bởi người vẽ bản đồ. Trình lập bản đồ chạy trên các cặp khóa / giá trị đầu vào không được sắp xếp. Mỗi trình ánh xạ phát ra không, một hoặc nhiều cặp khóa / giá trị đầu ra cho mỗi cặp khóa / giá trị đầu vào.

Các giai đoạn kết hợp được thực hiện bằng tổ hợp. Bộ kết hợp phải kết hợp các cặp khóa / giá trị với cùng một khóa. Mỗi bộ kết hợp có thể chạy không, một lần hoặc nhiều lần.

Các giai đoạn xáo trộn và sắp xếp được thực hiện bởi framework. Dữ liệu từ tất cả các trình ánh xạ được nhóm theo khóa, được phân chia giữa các trình giảm bớt và được sắp xếp theo khóa. Mỗi bộ rút gọn nhận được tất cả các giá trị được liên kết với cùng một khóa. Lập trình viên có thể cung cấp các chức năng so sánh tùy chỉnh để sắp xếp và một trình phân vùng để phân chia dữ liệu.

Bộ phân vùng quyết định bộ rút gọn nào sẽ nhận được một cặp giá trị khóa cụ thể.

Bộ giảm thiểu thu được các cặp khóa / [danh sách giá trị] được sắp xếp, được sắp xếp theo khóa. Danh sách giá trị chứa tất cả các giá trị có cùng một khóa do người lập bản đồ tạo ra. Mỗi bộ giảm phát ra 0, một hoặc nhiều cặp khóa / giá trị đầu ra cho mỗi cặp khóa / giá trị đầu vào .

Hãy xem bài viết javacodegeeks này của Maria Jurcovicova và bài viết mssqltips của Datta để hiểu rõ hơn

Dưới đây là hình ảnh từ bài viết của safaribooksonline

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng có một lỗi đánh máy trong hình ảnh (mà tôi nhận ra là chỉ được sao chép ở đây). Tôi tin rằng các iechuỗi trong Bộ giảm thiểu và Đầu ra thực sự nên như vậy is.
Jeff Evans

32

Tôi chỉ nghĩ đến việc bổ sung một số điểm còn thiếu trong các câu trả lời trên. Sơ đồ được lấy từ đây nói rõ những gì đang thực sự diễn ra.

nhập mô tả hình ảnh ở đây

Nếu tôi nói lại mục đích thực sự của

  • Tách: Cải thiện xử lý song song bằng cách phân phối tải xử lý trên các nút khác nhau (Người lập bản đồ), điều này sẽ tiết kiệm thời gian xử lý tổng thể.

  • Kết hợp: Thu hẹp đầu ra của mỗi Người lập bản đồ. Nó sẽ tiết kiệm thời gian dành cho việc di chuyển dữ liệu từ nút này sang nút khác.

  • Sắp xếp (Shuffle & Sort): Giúp thời gian chạy dễ dàng lên lịch (sinh ra / bắt đầu) các bộ giảm tốc mới, trong khi xem qua danh sách mục đã sắp xếp, bất cứ khi nào khóa hiện tại khác với khóa trước đó, nó có thể tạo ra một bộ giảm tốc mới .


Bước phân vùng sẽ đi vào đâu trong biểu đồ này? Sau khi bản đồ và trước khi kết hợp?
Joel

@Joel Tôi hy vọng bạn tham khảo bước 'tách'?
Supun Wijerathne

Không, ý tôi là bước phân vùng, nó quyết định việc gửi dữ liệu tới trình giảm thiểu nào, sử dụng mô-đun băm đơn giản theo mặc định, sau một số nghiên cứu nữa, tôi tin rằng nó xuất hiện sau bước kết hợp, trước khi trộn & sắp xếp.
Joel

1
@Joel Tôi không rõ bạn định mô tả điều gì. Tóm lại, trình tự chính xác của các bước có thể khá cụ thể cho từng vấn đề. Tôi có thể nói rằng đối với một số trường hợp, thậm chí việc phân loại là không cần thiết. Quay lại với đầu vào của bạn, nếu tôi nói cụ thể về ví dụ wordcount đơn giản ở trên, tôi thực sự không thấy cần thiết phải phân vùng như vậy để quyết định bộ giảm. Ở đây, nó khá dễ dàng để sinh ra giảm mỗi phím. Nhưng tôi có thể đoán rằng quan điểm của bạn có thể có giá trị trong một số trường hợp. Thành thật mà nói, tôi không có một ý tưởng rõ ràng chính xác về điều đó.
Supun Wijerathne

4

Một số yêu cầu xử lý dữ liệu hoàn toàn không cần sắp xếp. Syncsort đã làm cho việc phân loại trong Hadoop có thể cắm được. Đây là một blog hay của họ về phân loại. Quá trình di chuyển dữ liệu từ người lập bản đồ các gia giảm được gọi là xáo trộn, kiểm tra này bài viết để biết thêm thông tin về giống nhau.


2

Tôi luôn cho rằng điều này là cần thiết vì đầu ra từ trình ánh xạ là đầu vào cho bộ giảm tốc, vì vậy nó được sắp xếp dựa trên không gian phím và sau đó được chia thành các nhóm cho mỗi đầu vào bộ giảm tốc. Bạn muốn đảm bảo tất cả các giá trị giống nhau của một Khóa kết thúc trong cùng một nhóm đi đến bộ giảm tốc để chúng được giảm cùng nhau. Không có lý do gì khi gửi K1, V2 và K1, V4 đến các bộ giảm tốc khác nhau vì chúng cần phải ở cùng nhau để được giảm bớt.

Cố gắng giải thích nó càng đơn giản càng tốt


Nếu chúng ta muốn gửi k1, v1 và k1, v4 đến cùng một bộ giảm tốc, chúng ta có thể thực hiện xáo trộn. thì mục đích của việc sắp xếp là gì?
Nithin K Anil

Nó thực hiện việc sắp xếp vì nhiều lý do, một lý do là, khi một Công việc MapReduce gửi tất cả các cặp KV đến một bộ giảm tốc nếu đầu vào không được sắp xếp Nó sẽ phải quét tất cả các đầu ra của Mapper để chọn mọi trường hợp của K1, VX . trong khi nếu đầu ra Mapper được sắp xếp ngay sau khi K2, VX được chọn, bạn biết rằng tất cả K1, VX đã được chọn và tập hợp đó có thể được gửi đến một bộ giảm tốc để xử lý, lợi ích của việc này là bạn không. phải đợi mọi sự giảm bớt sẵn sàng để mỗi người trong số họ bắt đầu giảm.
BasicHorizon

Ngoài ra, khi nói đến tổng hợp, nếu bạn chỉ định bạn muốn Tổng hợp tất cả K1, V1 nếu đầu vào cho bộ giảm được sắp xếp ngay sau khi bộ giảm nhận trên K2, V2, nó biết rằng không còn trường hợp nào của K1, V1 tồn tại. nó có thể kết thúc nó tập hợp trong khi nếu giảm đầu vào không được sắp xếp nó sẽ phải quét toàn bộ đầu vào cho K1, V1
BasicHorizon

2

Xáo trộn là quá trình mà dữ liệu trung gian từ các trình ánh xạ được chuyển đến 0,1 hoặc nhiều bộ giảm thiểu. Mỗi bộ giảm tốc nhận được 1 hoặc nhiều khóa và các giá trị liên quan của nó tùy thuộc vào số bộ giảm tốc (đối với tải cân bằng). Hơn nữa, các giá trị được liên kết với mỗi khóa được sắp xếp cục bộ.


0

Chỉ có hai điều mà MapReduce thực hiện TỰ NHIÊN: Sắp xếp và (thực hiện theo sắp xếp) GroupBy có thể mở rộng.

Hầu hết các ứng dụng và Mẫu thiết kế trên MapReduce được xây dựng dựa trên hai hoạt động này, được cung cấp bằng cách trộn và sắp xếp.


0

Đây là một bài đọc hay. Hy vọng nó giúp. Về cách sắp xếp mà bạn đang quan tâm, tôi nghĩ đó là cho hoạt động hợp nhất trong bước cuối cùng của Bản đồ. Khi thao tác bản đồ được thực hiện và cần ghi kết quả vào đĩa cục bộ, một phép hợp nhất sẽ được vận hành trên các phần tách được tạo từ bộ đệm. Và đối với hoạt động hợp nhất, việc sắp xếp từng phân vùng theo hướng nâng cao là hữu ích.


0

Vâng, Trong MapReduce có hai cụm từ quan trọng gọi là Mappergiảm cả hai đều là quá quan trọng, nhưng giảm tốc là bắt buộc. Trong một số chương trình, bộ giảm tốc là tùy chọn. Bây giờ đến với câu hỏi của bạn. Trộn và sắp xếp là hai thao tác quan trọng trong Mapreduce. Khung công tác Hadoop đầu tiên lấy dữ liệu có cấu trúc / phi cấu trúc và tách dữ liệu thành Khóa, Giá trị.

Bây giờ chương trình Mapper phân tách và sắp xếp dữ liệu thành các khóa và giá trị cần xử lý. Tạo giá trị Khóa 2 và giá trị 2. Các giá trị này nên xử lý và sắp xếp lại theo thứ tự thích hợp để có được giải pháp mong muốn. Bây giờ việc xáo trộn và sắp xếp này được thực hiện trong hệ thống cục bộ của bạn (Framework hãy chăm sóc nó) và xử lý trong hệ thống cục bộ sau khi khuôn khổ quá trình dọn dẹp dữ liệu trong hệ thống cục bộ. Đồng ý

Ở đây chúng tôi cũng sử dụng bộ kết hợpphân vùng để tối ưu hóa quá trình xáo trộn và sắp xếp này. Sau khi sắp xếp hợp lý, các giá trị chính đó sẽ được chuyển đến Bộ giảm tốc để nhận được đầu ra của Khách hàng mong muốn. Cuối cùng Bộ giảm tốc có được đầu ra mong muốn.

K1, V1 -> K2, V2 (chúng ta sẽ viết chương trình Mapper), -> K2, V '(ở đây xáo trộn và làm mềm dữ liệu) -> K3, V3 Tạo đầu ra. K4, V4.

Xin lưu ý rằng tất cả các bước này chỉ là thao tác logic, không thay đổi dữ liệu ban đầu.

Câu hỏi của bạn: Mục đích của giai đoạn xáo trộn và sắp xếp trong bộ rút gọn trong Lập trình rút gọn bản đồ là gì?

Câu trả lời ngắn gọn: Để xử lý dữ liệu để có được đầu ra mong muốn. Xáo trộn là tổng hợp dữ liệu, giảm là nhận được đầu ra mong đợi.

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.