我正在使用MultipleOutputs来编写三个文件,即name,attrib,others和使用6个redcuers。 我在输出目录中获取这些文件:
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附加到attrib文件,是否任务0003编译了这个文件?)。我目前正在伪模式下运行Hadoop,在真正的集群上是否需要组合文件(即,由diff diffrs提供不同的文件)?另外,有没有办法可以从输出文件名中删除-r-xxxxx?
P.S我对Hadoop的了解非常有限。
答案 0 :(得分:1)
MultipleOutputs允许您将数据写入名称来自的文件 输出键和值,或实际上来自任意字符串。这允许每个减速器(或 mapper in a only-only job)创建多个文件。文件名是形式的 name-m-nnnnn 用于地图输出, name-r-nnnnn 用于减少输出,其中name是 由程序设置的任意名称,nnnnn是指定该部分的整数 数字,从零开始。部件号确保从不同分区(映射器或缩减器)写入的输出在同名的情况下不会发生冲突。
是的,您需要组合文件(即,如果您想要将单个文件作为输出,则可以通过差异缩减器使用不同的文件)。您可以在作业完成后合并文件。您可以查看此方法以附加文件。 public FSDataOutputStream append(Path f) throws IOException
。