【问题标题】:Java MapReduce program to work on PDF files用于处理 PDF 文件的 Java MapReduce 程序
【发布时间】:2014-11-24 14:15:54
【问题描述】:

我需要在使用 Java 的 mapreduce 程序中解析 PDF 文件。我正在使用 CDH 5.0.1 进行集群设置。我有一个由 FileInputFormat 扩展的自定义输入格式类,在该类中我重写了 getRecordReader 方法以返回自定义 RecordReader 的实例,并使用 isSplitable 方法防止文件不可拆分,如 SO answer 中所建议的那样。

现在的问题是,在当前的 CDH API getRecordReader 返回接口 org.apache.hadoop.mapred.RecordReader 而在上述 SO 答案中扩展为自定义记录读取器的接口是一个抽象类 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;
    }

}

感谢任何关于我在这里缺少什么的帮助或指示。

【问题讨论】:

    标签: java pdf hadoop mapreduce hadoop-yarn


    【解决方案1】:

    问题是你使用了错误的api(旧org.apache.hadoop.mapred.*api) 请使用新的 API (org.apache.hadoop.mapreduce.*)

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

    您使用这个新 API 的 SO 答案。在新 API 中,RecordReaderclass 而不是 interface

    更新

    mapred vs mapreduce API

    【讨论】:

    • 感谢您的回答,但如果我使用建议的 API,FileInputFormat 没有 getRecordReader 方法,而是有一个 createRecordReader。
    • 另外,我可以看到同一个 API 中可用的两个类,即 CDH 5.0.1 - Hadoop 2.3.0,没有任何一个列为已弃用。在这里,我给出了同一个 API 的两个类的链接。 org.apache.hadoop.mapred.FileInputFormatorg.apache.hadoop.mapreduce.lib.input.FileInputFormat
    • 你是对的,旧的 api 还没有被贬低,以支持遗留代码。如果你正在做一个新的代码,我建议使用新的 API 实现。要找到差异,请查看答案中的更新。
    • 非常感谢您的帮助,但在这种情况下,我如何支持覆盖新 API 中不存在的 getRecordReader 方法。
    • 你不需要那个方法。 createRecordReader 是新 API 中的替代品。我曾经为我的情况这样做过:github.com/thomachan/Custom-MR/blob/master/src/mapreduce/hi/api/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2013-09-15
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多