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