hadoop如何处理大文件?

时间:2013-03-19 03:23:07

标签: hadoop elastic-map-reduce

我对Hadoop完全不熟悉,虽然我理解map的概念相当好。

大多数Hadoop教程都以WordCount示例开头。所以我写了一个简单的wordcount程序,它运行得很好。但后来我试图统计一个非常大的文件。 (超过50GB)。

所以我对Hadoop专家的问题是,Hadoop将如何处理大文件?它会将文件的副本传输到每个映射器,还是会自动将其拆分为块并将这些块传输给映射器?

我使用MapReduce的大多数经验都是因为CouchDB中的映射器一次处理文档,但是从我读到的有关Hadoop的内容中,我想知道它是否设计用于处理多个小文件或少量大文件或两者兼而有之?

3 个答案:

答案 0 :(得分:3)

Hadoop通过将大文件拆分为64MB或128MB(默认)的块来处理大文件。这些块可在Datanodes中使用,元数据在Namenode中。当mapreduce程序运行时,每个块都会获得一个映射器以供执行。您无法设置映射器的数量。当映射器完成后,它们被发送到reducer。默认的reducer数量是1,可以设置,也就是输出的位置。它甚至可以处理多个小文件,但最好将它们分组到大文件以获得更好的性能。例如。如果每个小文件小于64MB,则每个文件都有一个映射器供执行。希望这有帮助!

答案 1 :(得分:1)

HDFS中的大量文件已经以分布式方式存储。运行mapreduce作业时,必须为文件指定InputFormat。如果InputFormat是可拆分的(即,它是未压缩的,或以bz2格式压缩),那么它可以根据需要在尽可能多的映射器之间进行划分。大多数合理的实现确保文件中的所有记录都转到某个映射器,没有映射器获得相同的记录两次。

不传输文件的副本 - 映射器只读取它们被分配的文件段。如果可能,这些要么通过网络流式传输,要么分配给存储文件的机器。只要为每个输入文件指定输入格式,就可以根据需要使用Hadoop读取任意数量的输入文件。

答案 2 :(得分:0)

默认情况下,Hadoop会按文件拆分数据并将每个文件发送到映射器。你可以覆盖它,但它有点复杂。如果文件尚未分开,我总是只使用脚本来分解文件。