我正在使用Hadoop示例程序WordCount来处理大量小文件/网页(cca.2-3 kB)。由于这与Hadoop文件的最佳文件大小相去甚远,因此程序非常慢。我想这是因为设置和撕毁工作的成本远远高于工作本身。此类小文件还会导致文件名命名空间耗尽。
我读到在这种情况下我应该使用 HDFS 存档 (HAR),但我不确定如何修改这个程序 WordCount 以从这个存档中读取。程序可以在不修改的情况下继续工作还是需要一些修改?
即使我在存档中打包了很多文件,问题仍然存在,这是否会提高性能。我读到即使我打包多个文件,一个存档中的这些文件也不会由一个映射器处理,而是由许多映射器处理,这在我的情况下(我猜)不会提高性能。
如果这个问题太简单,请理解我是Hadoop的新手,对它的经验很少。
使用 HDFS 不会改变你导致 hadoop 处理大量小文件的事实。在这种情况下,最好的选择可能是将文件cat
为单个(或几个大)文件。这将减少您拥有的映射器数量,从而减少需要处理的内容数量。
如果您在分布式系统上操作,使用 HDFS 可以提高性能。如果你只做伪分布式(一台机器),那么HDFS不会提高性能。限制是机器。
当您操作大量小文件时,将需要大量的映射器和化简器。设置/关闭可以与文件本身的处理时间相当,从而导致较大的开销。 cat
文件应该会减少Hadoop为作业运行的映射器数量,这应该会提高性能。
使用 HDFS 存储文件的好处是处于分布式模式,具有多台计算机。这些文件将跨计算机存储在块(默认为 64MB)中,每台计算机将能够处理驻留在计算机上的数据块。这减少了网络带宽的使用,因此不会成为处理的瓶颈。
归档文件,如果Hadoop要解压缩它们只会导致Hadoop仍然有大量的小文件。
希望这有助于您的理解。
根据我对Hadoop仍然有限的理解,我相信正确的解决方案是创建包含HTML文件作为值的SequenceFile
,并可能将URL作为键。如果在SequenceFile
上执行 M/R 作业,则每个映射器将处理许多文件(具体取决于拆分大小)。每个文件将作为单个输入呈现给地图函数。您可能希望使用 SequenceFileAsTextInputFormat
作为读取这些文件InputFormat
。
另请参阅:在Hadoop MapReduce中向单个地图提供多个非文本文件
我最近为这篇文章添加了书签,以便稍后阅读,并在这里发现了同样的问题:)该条目有点旧,不确定它现在有多相关。Hadoop的变化正在以非常快的速度发生。
http://www.cloudera.com/blog/2009/02/the-small-files-problem/
该博客条目由Tom White撰写,他也是"Hadoop:The Definitive Guide,Second Edition"的作者,这是为那些开始使用Hadoop的人推荐的。
http://oreilly.com/catalog/0636920010388
将文件提交到 Hadoop 之前连接文件吗?
在这种情况下可以使用 CombineFileInputFormat,它适用于小文件的大型数字。这会将许多此类文件打包在一个拆分中,因此每个映射器需要处理更多内容(1 个拆分 = 1 个映射任务)。mapreduce的整体处理时间也将下降,因为运行的映射器数量较少。由于没有存档感知的输入格式,因此使用CombineFileInputFormat将提高性能。