使用Hadoop处理大量小文件

我正在使用Hadoop示例程序WordCount来处理大量的小文件/网页(cca.2-3 kB)。 由于这远离hadoop文件的最佳文件大小,因此程序非常慢。 我想这是因为设置和撕毁工作的成本远远高于工作本身。 这些小文件也会导致文件名的命名空间耗尽。

我读到在这种情况下我应该使用HDFS存档(HAR),但我不确定如何修改此程序WordCount以从此存档中读取。 程序可以继续工作而无需修改或需要进行一些修改吗?

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

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

使用HDFS不会改变你导致hadoop处理大量小文件的情况。 在这种情况下,最好的选择可能是将文件捕获到单个(或几个大)文件中。 这将减少您拥有的映射器数量,这将减少需要处理的事物数量。

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

当您对大量小文件进行操作时,需要大量的映射器和缩减器。 设置/关闭可以与文件本身的处理时间相比,从而导致很大的开销。 捕获文件应减少作业的映射器hadoop运行次数,这应该可以提高性能。

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

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

希望这有助于您的理解。

从我仍然有限的理解和Hadoop,我相信正确的解决方案是创建包含HTML文件作为值的SequenceFile ,并可能将URL作为键。 如果您对SequenceFile执行M / R作业,则每个映射器将处理许多文件(取决于拆分大小)。 每个文件将作为单个输入呈现给地图function。 您可能希望使用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 split = 1 map task)。 mapreduce的整体处理时间也将下降,因为运行的映射器数量较少。 由于没有使用CombineFileInputFormat的归档感知InputFormat,因此可以提高性能。