2012-01-16 39 views
5

Tôi mới sử dụng Hadoop và tôi đang cố gắng tìm ra cách nó hoạt động. Đối với một bài tập tôi nên thực hiện một cái gì đó tương tự như ví dụ WordCount. Nhiệm vụ là để đọc trong một số tập tin, làm các WordCount và viết một tập tin đầu ra cho mỗi tập tin đầu vào. Hadoop sử dụng bộ kết hợp và xáo trộn đầu ra của phần bản đồ làm đầu vào cho bộ giảm tốc, sau đó ghi một tệp đầu ra (tôi đoán cho mỗi trường hợp đang chạy). Tôi đã tự hỏi nếu nó có thể viết một tập tin đầu ra cho mỗi tập tin đầu vào (để giữ cho các từ của inputfile1 và ghi kết quả để outputfile1 và vv). Có thể ghi đè lên Combiner-Class hoặc là có một giải pháp cho điều này (Tôi không chắc chắn nếu điều này thậm chí nên được giải quyết trong một Hadoop-Task nhưng đây là tập thể dục).Hadoop MapReduce - một tệp đầu ra cho mỗi đầu vào

Cảm ơn ...

Trả lời

1

map.input.file thông số môi trường có tên tệp mà người lập bản đồ đang xử lý. Nhận giá trị này trong trình ánh xạ và sử dụng giá trị này làm khóa đầu ra cho trình ánh xạ và sau đó tất cả k/v từ một tệp để chuyển đến một trình giảm tốc.

Mã trong trình ánh xạ. BTW, tôi đang sử dụng API MR cũ

@Override 
public void configure(JobConf conf) { 
    this.conf = conf; 
} 

@Override. 
public void map(................) throws IOException { 

     String filename = conf.get("map.input.file"); 
     output.collect(new Text(filename), value); 
} 

Và sử dụng MultipleOutputFormat, điều này cho phép ghi nhiều tệp đầu ra cho công việc. Tên tệp có thể được lấy từ các khóa và giá trị đầu ra.

+0

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

0

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

+0

Cảm ơn bạn đã nhập. Với setNumReduceTasks, tôi nhận được nhiều tệp đầu ra như tôi cần. Tuy nhiên đầu vào cho các bộ giảm vẫn được trộn lẫn/xáo trộn. Tôi đã kiểm tra đầu ra của bản đồ của tôi và có vẻ như một người lập bản đồ đang xử lý hai tệp (nhưng đây không phải là vấn đề). Nhưng cũng là kết quả của những người lập bản đồ chỉ xử lý một tệp được trộn lẫn với kết quả của những người lập bản đồ khác.Tôi có thể ngăn Hadoop thực hiện việc này (trộn/kết hợp được không? Có thể thiết lập combinerclass?) Bạn có nhận được tất cả tên tệp và chuyển chúng cho người lập bản đồ không? Hay tôi đang thiếu một cái gì đó? Có lẽ một giá trị conf khác sẽ được thiết lập? – spooky

+0

Để buộc một bộ giảm tốc cụ thể, mỗi người lập bản đồ sử dụng một khóa cụ thể khi viết đầu ra. Các phím tương tự sẽ đi đến cùng một người lập bản đồ. Bạn có thể chuyển một giá trị khác vào ký tự cho mỗi công việc, sau đó sử dụng giá trị đó làm khóa. Điều đó sẽ dẫn đến kết quả đầu ra cho mỗi người lập bản đồ sẽ giảm một lần (theo kinh nghiệm của tôi). – Nija

+1

Chuyển tên tệp cho người lập bản đồ để một tệp được xử lý bởi một người lập bản đồ đơn lẻ không phải là cách tiếp cận hiệu quả. Không có bản địa hóa dữ liệu và sẽ có nhiều dữ liệu xáo trộn hơn. Một cách để giải quyết là bó các tệp phụ thuộc vào 1 (gz, tar) và trả về false từ phương thức FileInputFormat # isSplitable. –

Các vấn đề liên quan