6

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

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

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

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

4

5 回答 5

4

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

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

当您对大量小文件进行操作时,将需要大量映射器和缩减器。setup/down 可以与文件本身的处理时间相媲美,造成很大的开销。cat配置文件应该会减少作业的映射器 hadoop 运行次数,这应该会提高性能。

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

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

希望这有助于您的理解。

于 2011-05-09T00:33:23.427 回答
3

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

另请参阅:在 Hadoop MapReduce 中为单个地图提供多个非文本文件

于 2011-05-12T17:52:50.523 回答
2

我最近为这篇文章添加了书签,以便稍后阅读,并在这里发现了同样的问题 :) 条目有点旧,不完全确定它现在的相关性。Hadoop 的变化正在以非常快的速度发生。

http://www.cloudera.com/blog/2009/02/the-small-files-problem/

该博客条目由 Tom White 撰写,他也是“Hadoop:权威指南,第二版”的作者,推荐阅读 Hadoop 入门者。

http://oreilly.com/catalog/0636920010388

于 2011-06-08T14:25:23.337 回答
1

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

于 2011-05-09T00:06:12.170 回答
0

在这种情况下可以使用 CombineFileInputFormat,它适用于大量的小文件。这会将许多此类文件打包在一个拆分中,因此每个映射器都有更多要处理的内容(1 个拆分 = 1 个映射任务)。由于运行的映射器数量较少,mapreduce 的整体处理时间也将下降。由于没有存档感知 InputFormat 使用 CombineFileInputFormat 将提高性能。

于 2014-03-28T20:15:39.197 回答