在Hadoop MapReduce中为单个地图提供几个非文本文件

时间:2011-02-27 14:56:24

标签: hadoop mapreduce

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

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

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

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

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

基本上,您将所有PDF放入序列文件中,并且映射器将接收与适合序列文件的一个HDFS块一样多的PDF。创建序列文件时,您将密钥设置为PDF文件名,该值将是PDF的二进制表示。

答案 1 :(得分:0)

您可以使用HDFS pathes为文件创建文本文件,并将其用作输入。它将为您的映射器重用许多文件,但会花费数据本地。如果您的数据相对较小,则高复制因子(接近数据节点数)将解决问题。