2011-05-08 67 views
6

我使用Hadoop示例程序WordCount处理大型小文件/网页集(cca。2-3 kB)。由于这与hadoop文件的最佳文件大小相距甚远,因此该程序非常慢。我想这是因为设置和裁员的成本远远大于工作本身。这样的小文件也会导致文件名的命名空间耗尽。使用Hadoop处理大量小文件集

我读过,在这种情况下,我应该使用HDFS压缩文件(HAR),但我不确定如何修改此程序WordCount以从此压缩文件读取。程序能否继续工作而不需要修改或者需要修改?

即使我在档案中打包了很多文件,问题仍然存在,如果这会提高性能。我读过,即使我打包了多个文件,一个存档内的这些文件也不会被一个映射器处理,但是很多,在我的情况下(我猜)不会提高性能。

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

回答

4

使用HDFS不会改变您导致hadoop处理大量小文件的情况。在这种情况下,最好的选择可能是将文件合并到一个(或几个大的)文件中。 这会减少你拥有的mappers的数量,这将减少需要处理的东西的数量。

如果您在分布式系统上运行,使用HDFS可以提高性能。如果你只做虚拟分发(一台机器),那么HDFS不会提高性能。限制是机器。

当您处理大量小文件时,需要大量的映射器和缩减器。 setup/down可以与文件本身的处理时间相媲美,造成大量开销。这些文件应该会减少hadoop为这项工作运行的映射器的数量,这应该会提高性能。

使用HDFS存储文件时可以看到的好处是使用多台机器的分布式模式。这些文件将跨机器以块(默认为64MB)存储,并且每台机器都能够处理驻留在机器上的数据块。这减少了网络带宽的使用,所以它不会成为处理的瓶颈。

归档文件,如果hadoop打算将它们归档,只会导致hadoop仍然有大量的小文件。

希望这有助于你的理解。

1

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

+0

我想我可以,但是因为我把页面的URL /地址放在文件的第一行,所以要识别新页面是否有点困难,或者只是定期链接到其他页面。 – Sasa 2011-05-09 00:49:09

3

从我对Hadoop的理解仍然有限,我相信正确的解决方案是创建SequenceFile(s)包含您的HTML文件作为值和可能的URL作为关键。如果您通过SequenceFile(s)执行M/R作业,则每个映射器将处理许多文件(取决于拆分大小)。每个文件将作为单个输入呈现给地图功能。 您可能想要使用SequenceFileAsTextInputFormat作为InputFormat来阅读这些文件。

另见:Providing several non-textual files to a single map in Hadoop MapReduce

0

CombineFileInputFormat在这种情况下,这对于大numaber小文件的工作很好地使用。这将许多这样的文件打包在一个分割中,因此每个映射器都有更多的处理(1 split = 1 map任务)。 由于映射器运行的次数较少,mapreduce的整体处理时间也将减少。 由于没有归档感知InputFormat使用CombineFileInputFormat会提高性能。