Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Hadoop MapReduce中为单个映射提供多个非文本文件_Hadoop_Mapreduce - Fatal编程技术网

在Hadoop MapReduce中为单个映射提供多个非文本文件

在Hadoop MapReduce中为单个映射提供多个非文本文件,hadoop,mapreduce,Hadoop,Mapreduce,我目前正在编写分布式应用程序,它在Hadoop MapReduce的帮助下解析Pdf文件。MapReduce作业的输入是数千个Pdf文件(大部分从100KB到~2MB),输出是一组解析的文本文件 出于测试目的,最初我使用Tom White的Hadoop中提供的WholeFileInputFormat。权威指南书,提供单文件到单地图。这对少量的输入文件很好,但是,由于明显的原因,它不能正确地处理数千个文件。对于需要大约一秒钟才能完成的任务,单个映射效率很低 所以,我想做的是将几个Pdf文件提交到一

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

出于测试目的,最初我使用Tom White的Hadoop中提供的
WholeFileInputFormat
。权威指南书,提供单文件到单地图。这对少量的输入文件很好,但是,由于明显的原因,它不能正确地处理数千个文件。对于需要大约一秒钟才能完成的任务,单个映射效率很低

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


感谢您的帮助。谢谢

我认为SequenceFile适合您的需要:


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

您可以创建文本文件,其中包含指向文件的HDFS路径,并将其用作输入。它将使您的映射器可以重用许多文件,但会降低数据的局部性。如果您的数据相对较小,高复制因子(接近数据节点数)将解决此问题。

即使PDF是SequenceFile,Hadoop也会使用filesplit为每个文件创建一个映射器。如果我使用“SequenceFile”,我需要将所有10000个PDF转换为“SequenceFile”块。这反过来又涉及在转换阶段将每个文件提交到每个地图,这不是很有效。无论如何,谢谢你的评论。创建序列文件不会花费很长时间,而且多次使用该文件会提高效率。我已经有一段时间没有使用它们了,但是如果我回忆正确,序列文件将在任务跟踪器上生成一个Mapper per HDFS块的实例,这些实例将为序列文件的本地块(inputsplit)中的每个记录调用一次map方法。要消除的最重要的开销是创建映射器实例,而不是在映射器实例中多次调用映射方法。我把我所有的PDF文件都转换成1GB的序列文件块,这样的操作并不昂贵。我将所有pdf文件放入SequenceFile,并通过直接将SequenceFile写入HDFS将其加载到HDFS中。现在,每个映射程序获得64Mb的sequencefile块。将1Gb的小Pdf文件放入sequencefile大约需要2分钟。在这种情况下,我需要实现自定义RecordReader和InputFormat,还是有一些实现可以使用?