Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 使用Hadoop处理大型小型文件集_Java_Hadoop_Mapreduce_Hdfs - Fatal编程技术网

Java 使用Hadoop处理大型小型文件集

Java 使用Hadoop处理大型小型文件集,java,hadoop,mapreduce,hdfs,Java,Hadoop,Mapreduce,Hdfs,我正在使用Hadoop示例程序WordCount处理大量小文件/网页(cca.2-3KB)。由于这与hadoop文件的最佳文件大小相差甚远,因此该程序非常慢。我猜这是因为设置和拆除作业的成本远远高于作业本身。这样的小文件还会导致文件名的名称空间耗尽 我读到,在这种情况下,我应该使用HDFS存档(HAR),但我不知道如何修改这个程序WordCount以从这个存档中读取。程序是否可以不经修改继续工作,或者是否需要进行一些修改 即使我在归档文件中打包了很多文件,问题仍然是这是否会提高性能。我了解到,即

我正在使用Hadoop示例程序WordCount处理大量小文件/网页(cca.2-3KB)。由于这与hadoop文件的最佳文件大小相差甚远,因此该程序非常慢。我猜这是因为设置和拆除作业的成本远远高于作业本身。这样的小文件还会导致文件名的名称空间耗尽

我读到,在这种情况下,我应该使用HDFS存档(HAR),但我不知道如何修改这个程序WordCount以从这个存档中读取。程序是否可以不经修改继续工作,或者是否需要进行一些修改

即使我在归档文件中打包了很多文件,问题仍然是这是否会提高性能。我了解到,即使我打包了多个文件,一个归档文件中的这些文件也不会由一个映射器处理,而是由多个映射器处理,在我的情况下(我猜),这不会提高性能


如果这个问题太简单,请理解我是Hadoop的新手,对它没有什么经验。

在将文件提交给Hadoop之前,您可以连接文件吗?

使用HDFS不会改变您导致Hadoop处理大量小文件的事实。在这种情况下,最好的选择可能是
cat
将文件放入单个(或几个大)文件中。 这将减少您拥有的映射程序的数量,从而减少需要处理的事情的数量

如果在分布式系统上操作,使用HDFS可以提高性能。如果您只使用psuedo分布式(一台机器),那么HDFS不会提高性能。限制是机器

当您在大量小文件上操作时,将需要大量的映射器和还原器。设置/关闭可以与文件本身的处理时间相比较,从而导致较大的开销
cat
ing这些文件可以减少hadoop为作业运行的映射程序的数量,从而提高性能

使用HDFS存储文件的好处将是分布式模式,使用多台机器。这些文件将在多台机器上以块(默认64MB)的形式存储,每台机器都能够处理驻留在机器上的一块数据。这减少了网络带宽的使用,因此不会成为处理过程中的瓶颈

归档这些文件,如果hadoop要取消归档,只会导致hadoop仍然有大量的小文件


希望这有助于您的理解。

从我对og Hadoop仍然有限的理解来看,我相信正确的解决方案是创建
SequenceFile
(s),其中包含HTML文件作为值,可能包含URL作为键。如果在序列文件上执行M/R作业,则每个映射器将处理许多文件(取决于拆分大小)。每个文件都将作为单个输入呈现给映射函数。 您可能希望使用
SequenceFileAsTextInputFormat
作为
InputFormat
来读取这些文件


另请参见:

我最近将这篇文章添加到书签,以便稍后阅读,并在这里发现了相同的问题:)条目有点旧,不确定它现在有多重要。Hadoop的变化速度非常快

这篇博文是TomWhite写的,他也是《Hadoop:权威指南,第二版》的作者,这是一本推荐给那些刚开始使用Hadoop的人阅读的书


在这种情况下,可以使用CombineFileInputFormat,它适用于大量小文件。这将许多这样的文件打包在一个单独的分割中,因此每个映射器都有更多的要处理(1个分割=1个映射任务)。 mapreduce的总体处理时间也将减少,因为运行的映射程序数量较少。
因为使用CombineFileInputFormat并没有支持归档的InputFormat,所以可以提高性能。

我想我可以,但因为我将页面的URL/地址放在文件的第一行,所以很难识别是新页面还是其他页面的常规链接。