Dữ liệu của khối Hadoop 'thành các khối có kích thước được định cấu hình. Mặc định là khối 64MB. Bạn có thể thấy nơi điều này gây ra các vấn đề cho cách tiếp cận của bạn; Mỗi người lập bản đồ chỉ có thể nhận được một phần của một tệp. Nếu tệp nhỏ hơn 64MB (hoặc bất kỳ giá trị nào được định cấu hình), thì mỗi trình ánh xạ sẽ chỉ nhận được 1 tệp.
Tôi đã có một ràng buộc rất giống nhau; Tôi cần một tập hợp các tập tin (đầu ra từ chuỗi giảm tốc trước đó) để được xử lý hoàn toàn bởi một người lập bản đồ duy nhất. Tôi sử dụng các thực tế < 64MB trong giải pháp của tôi Lực đẩy chính của giải pháp của tôi là tôi thiết lập nó để cung cấp cho người lập bản đồ tên tệp cần thiết để xử lý và nội bộ cho người lập bản đồ đã tải/đọc tệp. Điều này cho phép một người lập bản đồ duy nhất xử lý toàn bộ tệp - Nó không được xử lý phân tán tệp, nhưng với ràng buộc "Tôi không muốn phân phối các tệp riêng lẻ" - nó hoạt động. :)
Tôi đã có quá trình khởi chạy MR của mình ghi ra tên tệp của các tệp để xử lý thành các tệp riêng lẻ. Nơi những tập tin được viết là thư mục đầu vào. Vì mỗi tệp là < 64MB, khi đó một trình ánh xạ đơn sẽ được tạo cho mỗi tệp. Quy trình map
sẽ được gọi chính xác một lần (vì chỉ có 1 mục nhập trong tệp).
Sau đó, tôi lấy giá trị được chuyển đến người lập bản đồ và có thể mở tệp và thực hiện bất kỳ việc ánh xạ nào tôi cần làm. Do hadoop cố gắng thông minh về cách thức thực hiện các quy trình Map/Reduce, có thể cần phải xác định số lượng bộ giảm tốc để sử dụng sao cho mỗi trình ánh xạ đi đến một bộ giảm tốc duy nhất. Điều này có thể được đặt thông qua cấu hình mapred.reduce.tasks
. Tôi làm điều này thông qua job.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);
Quy trình của tôi có một số yêu cầu/ràng buộc bổ sung có thể khiến giải pháp cụ thể này hấp dẫn; nhưng cho một ví dụ về 1: trong 1: ra; Tôi đã thực hiện nó, và những điều cơ bản được trình bày ở trên.
HTH
cảm ơn, tôi nghĩ đó là ý tưởng tốt nhất. Có lẽ tôi sẽ sử dụng API cũ vì nó có vẻ dễ xử lý hơn, nhưng trước tiên tôi sẽ xem xét 0,20 – spooky