2014-11-24 29 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