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