Trong Hadoop khi nào các tác vụ giảm bắt đầu? Chúng có bắt đầu sau khi hoàn thành một tỷ lệ phần trăm (ngưỡng) nhất định của người lập bản đồ không? Nếu vậy, ngưỡng này có cố định không? Loại ngưỡng nào thường được sử dụng?
Câu trả lời:
Giai đoạn rút gọn có 3 bước: xáo trộn, sắp xếp, rút gọn. Shuffle là nơi dữ liệu được thu thập bởi bộ giảm thiểu từ mỗi trình ánh xạ. Điều này có thể xảy ra trong khi người lập bản đồ đang tạo dữ liệu vì nó chỉ là quá trình truyền dữ liệu. Mặt khác, sắp xếp và giảm bớt chỉ có thể bắt đầu sau khi tất cả các trình ánh xạ được thực hiện xong. Bạn có thể biết MapReduce đang làm gì bằng cách nhìn vào tỷ lệ phần trăm hoàn thành giảm tốc: 0-33% có nghĩa là nó đang thực hiện xáo trộn, 34-66% là sắp xếp, 67% -100% là giảm. Đây là lý do tại sao bộ giảm của bạn đôi khi có vẻ "bị kẹt" ở mức 33% - nó đang chờ người lập bản đồ hoàn thành.
Các trình giảm bớt bắt đầu xáo trộn dựa trên ngưỡng tỷ lệ phần trăm người lập bản đồ đã hoàn thành. Bạn có thể thay đổi tham số để có bộ giảm tốc bắt đầu sớm hơn hoặc muộn hơn.
Tại sao việc khởi động bộ giảm tốc sớm là một điều tốt? Bởi vì nó trải rộng quá trình truyền dữ liệu từ bộ lập bản đồ đến bộ giảm tải theo thời gian, đó là một điều tốt nếu mạng của bạn là nút cổ chai.
Tại sao việc khởi động bộ giảm tốc sớm là một điều tồi tệ? Bởi vì họ "hog up" giảm các slot trong khi chỉ sao chép dữ liệu và chờ người lập bản đồ kết thúc. Một công việc khác bắt đầu sau đó sẽ thực sự sử dụng các khe cắm giảm giờ không thể sử dụng chúng.
Bạn có thể tùy chỉnh thời điểm khởi động bộ giảm tốc bằng cách thay đổi giá trị mặc định của mapred.reduce.slowstart.completed.maps
in mapred-site.xml
. Giá trị của 1.00
sẽ đợi tất cả các trình ánh xạ kết thúc trước khi bắt đầu các trình giảm bớt. Giá trị của 0.0
sẽ bắt đầu các bộ giảm ngay lập tức. Giá trị của 0.5
sẽ bắt đầu bộ giảm khi một nửa số bộ ánh xạ hoàn tất. Bạn cũng có thể thay đổi mapred.reduce.slowstart.completed.maps
theo từng công việc. Trong các phiên bản mới của Hadoop (ít nhất là 2.4.1), tham số được gọi làmapreduce.job.reduce.slowstart.completedmaps
(cảm ơn người dùng yegor256).
Thông thường, tôi muốn giữ mapred.reduce.slowstart.completed.maps
ở trên 0.9
nếu hệ thống có nhiều công việc chạy cùng một lúc. Bằng cách này, công việc không làm khó các bộ giảm khi chúng không làm gì khác ngoài việc sao chép dữ liệu. Nếu bạn chỉ có một công việc đang thực hiện tại một thời điểm, thì việc làm 0.1
có lẽ sẽ phù hợp.
Giai đoạn giảm có thể bắt đầu rất lâu trước khi bộ giảm được gọi. Ngay sau khi người lập bản đồ "a" hoàn thành công việc, dữ liệu được tạo sẽ trải qua một số phân loại và xáo trộn (bao gồm lệnh gọi đến bộ kết hợp và bộ phân vùng). "Giai đoạn" giảm tốc bắt đầu vào thời điểm bắt đầu xử lý dữ liệu trình ánh xạ bài đăng. Khi quá trình xử lý này được thực hiện, bạn sẽ thấy tiến trình trong tỷ lệ phần trăm giảm bớt. Tuy nhiên, chưa có bộ giảm tốc nào được gọi vào. Tùy thuộc vào số lượng bộ xử lý có sẵn / được sử dụng, bản chất của dữ liệu và số lượng bộ giảm dự kiến, bạn có thể muốn thay đổi tham số như được mô tả bởi @ Donald-miner ở trên.
Theo như tôi hiểu thì Giảm giai đoạn bắt đầu với giai đoạn bản đồ và tiếp tục sử dụng hồ sơ từ bản đồ. Tuy nhiên, vì có giai đoạn sắp xếp và xáo trộn sau giai đoạn bản đồ, tất cả các kết quả đầu ra phải được sắp xếp và gửi đến trình giảm bớt. Vì vậy, về mặt logic, bạn có thể tưởng tượng rằng giai đoạn giảm chỉ bắt đầu sau giai đoạn bản đồ nhưng trên thực tế, vì lý do hiệu suất, các trình giảm bớt cũng được khởi tạo với trình ánh xạ.
Tỷ lệ phần trăm được hiển thị cho giai đoạn giảm thực sự là về lượng dữ liệu được sao chép từ đầu ra của bản đồ đến các thư mục đầu vào của bộ giảm. Để biết khi nào thì việc sao chép này bắt đầu? Đó là một cấu hình bạn có thể đặt như Donald đã trình bày ở trên. Sau khi tất cả dữ liệu được sao chép vào bộ giảm (tức là.
Reduce chỉ bắt đầu sau khi tất cả người lập bản đồ đã đánh bắt nhiệm vụ ở đó, Reducer phải giao tiếp với tất cả người lập bản đồ vì vậy nó phải đợi cho đến khi người lập bản đồ cuối cùng hoàn thành nhiệm vụ của mình. Người lập bản đồ trên web bắt đầu chuyển dữ liệu đến thời điểm nó đã hoàn thành nhiệm vụ của mình.
Hãy xem xét một ví dụ về WordCount để hiểu rõ hơn về cách hoạt động của tác vụ thu gọn bản đồ. Giả sử chúng ta có một tệp lớn, chẳng hạn như một cuốn tiểu thuyết và nhiệm vụ của chúng ta là tìm số lần mỗi từ xuất hiện trong tệp. Vì tệp lớn, nó có thể được chia thành các khối khác nhau và được sao chép trong các nút công nhân khác nhau. Công việc đếm từ bao gồm các nhiệm vụ bản đồ và rút gọn. Nhiệm vụ bản đồ lấy mỗi khối làm đầu vào và tạo ra một cặp khóa-giá trị trung gian. Trong ví dụ này, vì chúng tôi đang đếm số lần xuất hiện của các từ, trình ánh xạ trong khi xử lý một khối sẽ dẫn đến kết quả trung gian của biểu mẫu (word1, count1), (word2, count2), v.v. Kết quả trung gian của tất cả trình ánh xạ là qua giai đoạn xáo trộn sẽ sắp xếp lại kết quả trung gian.
Giả sử rằng kết quả bản đồ của chúng tôi từ những người lập bản đồ khác nhau có dạng sau:
Bản đồ 1: - (là, 24) (đã, 32) (và, 12)
Bản đồ2: - (của tôi, 12) (là, 23) (là, 30)
Các kết quả đầu ra của bản đồ được sắp xếp theo cách mà các giá trị khóa giống nhau được cung cấp cho cùng một trình thu gọn. Ở đây nó có nghĩa là các khóa tương ứng với là, v.v ... đi cùng một bộ giảm tốc. Nó là bộ giảm tốc tạo ra kết quả cuối cùng, trong trường hợp này sẽ là: - (và, 12) (là, 47) (của tôi, 12 ) (là, 62)
Các tác vụ của bộ giảm chỉ bắt đầu sau completion
tất cả các công cụ lập bản đồ.
Nhưng quá trình chuyển dữ liệu xảy ra sau each
Bản đồ. Trên thực tế nó là một hoạt động kéo.
Điều đó có nghĩa là, mỗi lần lập trình giảm thời gian sẽ hỏi mọi maptask xem họ có một số dữ liệu cần lấy lại từ Bản đồ hay không.
Dữ liệu trung gian từ Mapper được lưu trữ trong disk
. Và việc chuyển dữ liệu từ Mapper sang Reduce diễn ra thông qua Network ( Data Locality
không được bảo toàn trong giai đoạn Reduce)