2012-06-12 36 views
9

Tôi muốn biết nếu đầu ra 'instance' của OutputCollector được sử dụng trong hàm bản đồ: output.collect (khóa, giá trị) this -output- lưu trữ các cặp giá trị khóa ở đâu đó? ngay cả khi nó phát ra chức năng giảm tốc, chúng phải là một tệp trung gian, phải không? Các tệp đó là gì? Họ có thể nhìn thấy và quyết định bởi người lập trình không? Là OutputKeyClass và OutputValueClasses mà chúng tôi chỉ định trong chức năng chính của những nơi lưu trữ này? [Text.class và IntWritable.class]Hadoop: OutputCollector hoạt động như thế nào trong MapReduce?

Im cho mã chuẩn cho ví dụ Word Count trong MapReduce, mà chúng ta có thể tìm thấy ở nhiều nơi trong mạng.

public class WordCount { 

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
String line = value.toString(); 
StringTokenizer tokenizer = new StringTokenizer(line); 
while (tokenizer.hasMoreTokens()) { 
word.set(tokenizer.nextToken()); 
output.collect(word, one); 
} 
} 
} 

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
int sum = 0; 
while (values.hasNext()) { 
sum += values.next().get(); 
} 
output.collect(key, new IntWritable(sum)); 
} 
} 

public static void main(String[] args) throws Exception { 
JobConf conf = new JobConf(WordCount.class); 
conf.setJobName("wordcount"); 

conf.setOutputKeyClass(Text.class); 
conf.setOutputValueClass(IntWritable.class); 

conf.setMapperClass(Map.class); 
conf.setCombinerClass(Reduce.class); 
conf.setReducerClass(Reduce.class); 

conf.setInputFormat(TextInputFormat.class); 
conf.setOutputFormat(TextOutputFormat.class); 

FileInputFormat.setInputPaths(conf, new Path(args[0])); 
FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
JobClient.runJob(conf); 
} 
} 
+0

Tại sao bạn muốn truy cập các tệp tạm thời này? Bạn có một điều sepecfic bạn muốn đạt được? hay nó chỉ là sự quyết định? – adranale

+0

Tôi muốn thay đổi vị trí của các tệp tạm thời này. – catty

Trả lời

2

Tôi tin rằng chúng được lưu trữ ở vị trí tạm thời và không khả dụng cho nhà phát triển, trừ khi bạn tạo lớp học của riêng mình triển khai OutputCollector.

Tôi đã từng phải truy cập vào các tập tin và giải quyết vấn đề bằng cách tạo ra các file hiệu ứng phụ: http://hadoop.apache.org/common/docs/r0.20.2/mapred_tutorial.html#Task+Side-Effect+Files

+0

Có ai có mã cho chức năng .collect() của OutputCollector không? – catty

3

Kết quả từ chức năng Bản đồ được lưu trữ trong tập tin trung gian tạm thời. Các tệp này được xử lý một cách minh bạch bởi Hadoop, vì vậy trong một kịch bản bình thường, lập trình viên không có quyền truy cập vào đó. Nếu bạn tò mò về những gì đang xảy ra bên trong mỗi người lập bản đồ, bạn có thể xem lại nhật ký cho công việc tương ứng nơi bạn sẽ tìm thấy tệp nhật ký cho mỗi tác vụ bản đồ.

Nếu bạn muốn kiểm soát nơi tệp tạm thời được tạo và có quyền truy cập vào chúng, bạn phải tạo lớp OutputCollector của riêng mình và tôi không biết mức độ dễ dàng như thế nào.

Nếu bạn muốn xem mã nguồn, bạn có thể sử dụng svn để tải xuống. Tôi nghĩ rằng nó có sẵn ở đây: http://hadoop.apache.org/common/version_control.html.

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