2014-11-24 11 views
1

我需要使用Java在mapreduce程序中解析PDF文件。我正在使用CDH 5.0.1進行羣集設置。我有一個由FileInputFormat擴展的自定義輸入格式類,其中我重寫了getRecordReader方法來返回自定義RecordReader的實例,並且isSplitable方法可以防止文件如本文SO answer中所建議的那樣是不可拆分的。Java MapReduce程序在PDF文件上工作

現在的問題是,在當前的CDH API中,getRecordReader返回接口org.apache.hadoop.mapred.RecordReader,而在上面的SO答案中擴展到自定義Record Reader時,是一個抽象類org.apache.hadoop。 mapreduce.RecordReader。

我的自定義輸入格式類:

import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.RecordReader; 

public class PDFInputFormat extends FileInputFormat<Text, Text> { 

@Override 
public RecordReader<Text, Text> getRecordReader(InputSplit split, JobConf conf, Reporter reporter) throws IOException { 
    return new PDFRecordReader(); 
    } 

@Override 
protected boolean isSplitable(FileSystem fs, Path filename) { 
    return false; 
    } 

} 

欣賞任何幫助或指針,以什麼我錯過這裏。

回答

1

問題是你使用了錯誤的API(舊org.apache.hadoop.mapred.* API) 請使用新的API(org.apache.hadoop.mapreduce.*

org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
org.apache.hadoop.mapreduce.RecordReader; 

的SO回答您使用這個新的API以下。在新的API RecordReaderclass沒有interface

UPDATE

mapred vs mapreduce API

+0

謝謝回答,但如果我使用建議API的FileInputFormat沒有getRecordReader方法,而它有一個createRecordReader。 – Harman 2014-11-25 15:50:37

+0

此外,我可以在同一個API中看到兩個類,即CDH 5.0.1 - Hadoop 2.3.0,但不包含任何已列爲棄用的類。 在這裏,我給出了同一個API的兩個類的鏈接。 [org.apache.hadoop.mapred.FileInputFormat](http://archive-primary.cloudera.com/cdh5/cdh/5/hadoop-2.3.0-cdh5.0.1/api/index.html?org/apache /hadoop/mapred/FileInputFormat.html) [org.apache.hadoop.mapreduce.lib.input.FileInputFormat](http://archive-primary.cloudera.com/cdh5/cdh/5/hadoop-2.3.0- cdh5.0.1/api/index.html?org/apache/hadoop/mapred/FileInputFormat.html) – Harman 2014-11-25 16:06:09

+0

你是正確的舊api還沒有被depricated,以支持遺留代碼。如果你正在做一個新的代碼,我建議使用新的API實現。要找到差異,請參閱答案中的更新。 – 2014-11-26 05:08:51