1

我正在使用 MultipleOutputs 编写三个文件,即名称、属性、其他文件并使用 6 个还原器。我在我的输出目录中得到这些文件:

attrib-r-00003  name-r-00004   part-r-00000  part-r-00002  part-r-00004  _SUCCESS
_logs           other-r-00001  part-r-00001  part-r-00003  part-r-00005

我的问题是,这些文件是如何命名的(为什么将 -r-0003 附加到属性文件,是任务 0003 编译了这个文件吗?)。我目前在伪模式下运行 Hadoop,在真正的集群上是否需要合并文件(即 attrib 是否会通过 diff reducers 拥有不同的文件)?另外,有没有办法可以从我的输出文件名中删除 -r-xxxxx ?

PS 我对 Hadoop 的了解非常有限。

4

1 回答 1

1

MultipleOutputs 允许您将数据写入文件,其名称源自输出键和值,或者实际上源自任意字符串。这允许每个化简器(或仅映射作业中的映射器)创建多个文件。文件名的形式 为 name-m-nnnnn用于 map 输出和 name-r-nnnnn用于 reduce 输出,其中 name 是由程序设置的任意名称,nnnnn 是指定零件编号的整数,从零开始. 部件号确保从不同分区(映射器或缩减器)写入的输出在同名的情况下不会发生冲突。

是的,如果您想要单个文件作为输出,您必须合并文件(即,通过 diff reducers 将属性具有不同的文件)。您可以在作业完成后合并文件。您可以查看此方法来附加文件。public FSDataOutputStream append(Path f) throws IOException.

于 2013-10-08T11:21:14.070 回答