Tôi gặp vấn đề với sự hiểu biết của mình về quy trình hợp nhất tệp ở phía rút gọn của Hadoop như được mô tả trong "Hadoop: The Definitive Guide" (Tom White). Để trích dẫn nó:
Khi tất cả các đầu ra bản đồ đã được sao chép, tác vụ rút gọn sẽ chuyển sang giai đoạn sắp xếp (đúng ra phải gọi là giai đoạn hợp nhất, vì việc sắp xếp được thực hiện ở phía bản đồ), giai đoạn này hợp nhất các đầu ra bản đồ, duy trì thứ tự sắp xếp của chúng. Việc này được thực hiện theo vòng. Ví dụ: nếu có 50 kết quả đầu ra bản đồ và hệ số hợp nhất là 10 (mặc định, được kiểm soát bởi thuộc tính io.sort.factor, giống như trong quá trình hợp nhất bản đồ), mỗi vòng sẽ có năm vòng. vòng sẽ hợp nhất 10 tệp thành một, vì vậy cuối cùng sẽ có năm tệp trung gian. Thay vì có vòng cuối cùng hợp nhất năm tệp này thành một tệp được sắp xếp duy nhất, việc hợp nhất sẽ tiết kiệm một chuyến đi vào đĩa bằng cách cung cấp trực tiếp chức năng rút gọn trong hàm. giai đoạn cuối: giai đoạn rút gọn. Sự hợp nhất cuối cùng này có thể đến từ sự kết hợp của các phân đoạn trong bộ nhớ và trên đĩa.
Số lượng tệp được hợp nhất trong mỗi vòng thực sự tinh tế hơn so với ví dụ này gợi ý. Mục tiêu là hợp nhất số lượng tệp tối thiểu để đạt được hệ số hợp nhất cho vòng cuối cùng. 10 tệp trong mỗi vòng trong số bốn vòng để có được 4 tệp. Thay vào đó, vòng đầu tiên sẽ chỉ hợp nhất 4 tệp và ba vòng tiếp theo sẽ hợp nhất toàn bộ 4 tệp đã hợp nhất và 6 tệp (chưa được hợp nhất). tổng cộng 10 tệp cho vòng cuối cùng Quá trình này được minh họa trong Hình 6-7. Lưu ý rằng điều này không thay đổi số vòng; nó chỉ là một sự tối ưu hóa để giảm thiểu lượng dữ liệu được ghi vào đĩa, vì vòng cuối cùng luôn hợp nhất. trực tiếp vào phần giảm.
Trong ví dụ thứ hai (với 40 tệp), chúng tôi thực sự nhận được vòng hệ số hợp nhất cuối cùng. Ở vòng thứ năm, 10 tệp không được ghi vào đĩa và trực tiếp bị thu nhỏ. Nhưng trong ví dụ đầu tiên, thực tế có 6 vòng chứ không phải 5. Trong mỗi vòng trong số năm vòng đầu tiên, 10 tệp được hợp nhất và ghi vào đĩa, sau đó ở vòng 6, chúng tôi có 5 tệp (không phải 10!) Sẽ trực tiếp giảm bớt. Tại sao? Nếu chúng ta bám sát "mục tiêu là hợp nhất số lượng tệp tối thiểu để đạt được hệ số hợp nhất trong vòng cuối cùng", thì đối với 50 tệp đó, chúng ta phải hợp nhất 5 tệp ở vòng đầu tiên và sau đó là 10 tệp ở mỗi vòng trong số 4 tệp tiếp theo. round, sau đó chúng tôi hợp nhất vào vòng thứ 6 cuối cùng với hệ số 10.
Lưu ý rằng chúng tôi không thể hợp nhất nhiều hơn 10 tệp trong mỗi vòng (được chỉ định bởi io.sort.factor cho cả hai ví dụ).
Tôi đã hiểu sai điều gì về ví dụ đầu tiên về việc hợp nhất 50 tệp?
Đó là cách tôi hiểu nó. Nếu bạn đọc kỹ, những điểm quan trọng cần nhớ là:
Lưu ý rằng điều này không thay đổi số vòng; nó chỉ là một sự tối ưu hóa để giảm thiểu lượng dữ liệu được ghi vào đĩa, vì vòng cuối cùng luôn hợp nhất trực tiếp vào phần rút gọn.
Có hoặc không có tối ưu hóa, số vòng hợp nhất vẫn giữ nguyên(5 trong trường hợp đầu tiên, 4 trong trường hợp thứ hai).
- Trường hợp đầu tiên: hợp nhất 50 tệp vào 5 tệp cuối cùng và đưa chúng trực tiếp vào giai đoạn "giảm" (tổng số vòng là 5 + 1 = 6)
- Trường hợp thứ hai: 34 tệp được hợp nhất thành 4 tệp cuối cùng và 6 tệp còn lại được đọc trực tiếp từ bộ nhớ và gửi đến giai đoạn "rút gọn" (tổng số vòng là 4 + 1 = 5)
Trong cả hai trường hợp, số vòng hợp nhất được định cấu hình bằng cách đặt thành 10 mapreduce.task.io.sort.factor
Quyết định.
Do đó, số vòng hợp nhất không thay đổi (cho dù việc tối ưu hóa đã hoàn thành hay chưa). Tuy nhiên, số lượng tệp được hợp nhất trong mỗi vòng có thể thay đổi (vì khung Hadoop có thể đưa ra một số tối ưu hóa để giảm số lượng tệp được hợp nhất và do đó số lượng bị tràn vào đĩa).
Vì vậy, trong trường hợp đầu tiên,Không tối ưu hóa,Nội dung của 50 tệp (được kết hợp thành 5 tệp cuối cùng) được đổ vào đĩa và các tệp được đọc từ đĩa, đang trong giai đoạn "giảm".
Trong trường hợp thứ hai,Sau khi tối ưu hóa, nội dung của 34 tệp (được hợp nhất thành 4 tệp cuối cùng) được tràn vào đĩa, các tệp này được đọc từ đĩa và 6 tệp chưa hợp nhất còn lại được đọc trực tiếp từ đĩa vào bộ nhớ đệm, đang trong giai đoạn "giảm".
Ý tưởng tối ưu hóa là giảm thiểu việc hợp nhất và tràn.
Tôi là một lập trình viên xuất sắc, rất giỏi!