3

尽管我非常了解 map reduce 的概念,但我对 Hadoop 完全陌生。

大多数 Hadoop 教程都是从 WordCount 示例开始的。所以我写了一个简单的wordcount程序,效果很好。但后来我试图计算一个非常大的文档的字数。(超过 50GB)。

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

我对 MapReduce 的大部分经验是因为 CouchDB,其中 mapper 一次处理文档,但从我读到的有关 Hadoop 的内容中,我想知道它是否旨在处理多个小文件或几个大文件或两者兼而有之?

4

3 回答 3

3

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

于 2013-03-19T04:01:20.703 回答
1

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

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

于 2013-03-19T03:55:12.737 回答
0

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

于 2013-03-19T03:27:11.940 回答