1

我有一份hadoop的工作。说明工作后,我启动了一些映射器。每个映射器都会将一些文件写入磁盘,例如 part-m-00000、part-m-00001。据我了解,每个映射器都会创建一个零件文件。我有大量数据,所以必须有不止一个映射器,但我能以某种方式控制这个输出文件的数量吗?我的意思是,hadoop 将启动,例如 10 个映射器,但只有三个部分文件?

我发现这篇文章 How do multiple reducers output only one part-file in Hadoop? 但是有使用旧版本的hadoop库。我正在使用来自 org.apache.hadoop.mapreduce.* 而不是来自 org.apache.hadoop.mapred.* 的类

我正在使用 hadoop 0.20 版和 hadoop-core:1.2.0.jar

有没有可能使用新的hadoop API来做到这一点?

4

4 回答 4

5

输出文件的数量等于减速器的数量,如果没有减速器,则等于映射器的数量。

您可以将单个 reducer 添加到您的作业中,以便将所有映射器的输出定向到它并获得一个输出文件。请注意,由于所有数据(映射器的输出)将通过线路(网络 IO)发送到减速器将运行的节点,因此效率会降低。此外,由于单个进程将(最终)获取所有数据,因此它可能会运行得更慢。

顺便说一句,有多个部分的事实不应该很重要,因为您可以将包含它们的目录传递给后续作业

于 2013-07-19T14:16:17.393 回答
0

我不确定你能做到(你的链接是关于多个输出而不是只收敛到一个),为什么只使用一个输出?你会失去排序上的所有并行性吗?

我还在处理大文件(每个约 10GB),我的 MR 进程每个几乎 100GB。因此,为了降低地图编号,我在 hdfs 中设置了更高的块大小值(仅适用于较新的文件)和更高的mapred.min.split.sizeinmapred-site.xml

于 2013-07-19T11:55:56.113 回答
0

您可能想查看MultipleOutputFormat

Javadoc 的部分内容:

这个抽象类扩展了 FileOutputFormat,允许将输出数据写入不同的输出文件。

Mapper 和 Reducer 都可以使用它。

查看此链接,了解如何从不同的映射器中指定一个或多个输出文件名以输出到 HDFS。

注意:此外,请确保您不使用 context.write() 以便不会创建来自 10 个映射器的 10 个文件。仅使用 MultipleOutputFormat 进行输出。

于 2013-07-19T12:19:08.773 回答
0

如果作业没有减速器、分区器和组合器,则每个映射器输出一个输出文件。在某些时候,您应该运行一些后处理以将输出收集到大文件中。

于 2015-11-11T07:13:17.500 回答