【问题标题】:Providing several non-textual files to a single map in Hadoop MapReduce为 Hadoop MapReduce 中的单个地图提供多个非文本文件
【发布时间】:2011-07-05 06:26:41
【问题描述】:

我目前正在编写分布式应用程序,它在 Hadoop MapReduce 的帮助下解析 Pdf 文件。 MapReduce 作业的输入是数千个 Pdf 文件(大部分范围从 100KB 到 ~2MB),输出是一组已解析的文本文件。

出于测试目的,最初我使用了 Tom White 的 Hadoop 中提供的WholeFileInputFormat。 The Definitive Guide 书,提供单个文件到单个地图。这适用于少量输入文件,但是,由于显而易见的原因,它不适用于数千个文件。需要大约一秒钟才能完成的任务的单一地图效率低下。

所以,我想做的是将几个 Pdf 文件提交到一个 Map 中(例如,将几个文件组合成一个块,其 HDFS 块大小约为 64MB)。我发现CombineFileInputFormat 对我的情况很有用。但是我不知道如何扩展该抽象类,以便我可以将每个文件及其文件名作为单个键值记录处理。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    您可以使用文件的 HDFS 路径创建文本文件并将其用作输入。它将使您的映射器重用许多文件,但会花费数据局部性。如果你的数据比较小,高复制因子(接近数据节点的数量)就可以解决问题。

    【讨论】:

    • 在这种情况下,我需要实现自定义 RecordReader 和 InputFormat 还是有一些实现可以使用?
    【解决方案2】:

    我认为 SequenceFile 将满足您的需求:http://wiki.apache.org/hadoop/SequenceFile

    基本上,您将所有 PDF 放入一个序列文件中,映射器将接收到适合该序列文件的一个 HDFS 块的尽可能多的 PDF。创建序列文件时,您需要将键设置为 PDF 文件名,值将是 PDF 的二进制表示。

    【讨论】:

    • 即使 pdf 是序列文件,Hadoop 也会使用文件拆分为每个文件创建一个映射器。
    • 如果我使用“SequenceFile”,我需要将所有 10,000 个 pdf 文件转换为“SequenceFile”块。反过来,这又涉及在此转换阶段将每个文件提交到每个地图,这不是很有效。无论如何,感谢您的评论。
    • 创建序列文件应该不会花费很长时间,效率的提升来自于多次使用该文件。自从我使用它们已经有一段时间了,但如果我没记错的话,序列文件将导致任务跟踪器上的每个 HDFS 块都有一个 Mapper 实例,并且这些实例将为本地中的每条记录调用一次 map 方法序列文件的块(输入分割)。要消除的最重要开销是创建映射器实例,而不是在映射器实例中多次调用 map 方法。
    • 谢谢你,臭马特。我将我所有的 pdf 文件转换成 1 GB 的序列文件块,而且这个操作并不昂贵。我通过将 SequenceFiles 直接写入 HDFS 来结合将所有 pdf 放入 SequenceFile 并将它们加载到 HDFS 的任务。现在每个 Mapper 都获得了 64Mb 的序列文件。
    • 将 1Gb 的小 Pdf 文件放入序列文件大约需要 2 分钟。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多