2011-09-18 29 views
5

Trong sách "Hadoop: The Definitive Guide", có một chương trình mẫu có mã bên dưới.Tại sao chúng ta cần đặt lớp khóa/giá trị đầu ra một cách rõ ràng trong chương trình Hadoop?

JobConf conf = new JobConf(MaxTemperature.class); 
conf.setJobName("Max temperature"); 
FileInputFormat.addInputPath(conf, new Path(args[0])); 
FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
conf.setMapperClass(MaxTemperatureMapper.class); 
conf.setReducerClass(MaxTemperatureReducer.class); 
conf.setOutputKeyClass(Text.class); 
conf.setOutputValueClass(IntWritable.class); 

Khung MR sẽ có thể tìm ra khóa đầu ra và lớp giá trị từ Mapper và chức năng Giảm đang được đặt trên lớp JobConf. Tại sao chúng ta cần phải thiết lập rõ ràng khóa đầu ra và lớp giá trị trên lớp JobConf? Ngoài ra, không có API tương tự cho cặp khóa/giá trị đầu vào.

Trả lời

7

Lý do là loại tẩy xóa [1]. Bạn thiết lập các lớp K/V đầu ra làm generics. Trong quá trình thiết lập công việc (đó là thời gian chạy, không biên dịch thời gian), các generics này bị xóa.

Các lớp k/v đầu vào có thể được đọc từ tệp đầu vào, trong trường hợp SequenceFiles, các lớp nằm trong tiêu đề- bạn có thể đọc chúng khi mở tệp trình tự trong trình chỉnh sửa. Tiêu đề này phải được viết, vì mỗi đầu ra bản đồ là một SequenceFile, vì vậy bạn cần cung cấp các lớp.

[1] http://download.oracle.com/javase/tutorial/java/generics/erasure.html

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