我目前正在运行一个hadoop oozie工作。输出文件自动生成。预期的输出文件数量只有一个;但是,有两个输出文件叫做part-r-00000和part-r-00001。有时,第一个(part-r-00000)有数据,第二个(part-r-00001)没有数据。有时,第二个有,第一个没有。谁能告诉我为什么?另外,如何将输出文件设置为part-r-00000?
答案 0 :(得分:0)
输出的文件数取决于映射器和缩减器的数量。在您的情况下,文件数和文件名表示您的输出来自2个reducer。
限制映射器或缩减器的数量取决于您的语言(Hive,Java等),但每个都有一个属性,您可以设置为限制这些属性。有关Java MapReduce作业,请参阅here。
如果特定的映射器或reducer任务在给定的数据节点上没有结果数据,则文件可以为空。
最后,我认为你不想限制你的地图制作者和缩减者。这将打败使用Hadoop的重点。如果您的目标是将所有文件都读为一个文件,请确保将它们合并到给定目录中,并将该目录作为文件名传递。这些文件将被视为一个。
答案 1 :(得分:0)
在Hadoop中,输出文件是Reducers(或Mappers,如果它只是一个地图方面的工作,在这种情况下它将是part-m-xxxxx
文件)的产品。如果你的作业使用两个reducers,这意味着在每个reduce程序完成后,它将以part-r-xxxxx
的形式写入输出目录,其中数字表示哪个reducer写出来。
也就是说,您不能指定单个输出文件,而只能指定目录。要将输出目录中的所有文件都放入单个文件中,请使用:
hdfs dfs -getmerge <src> <localdst> [addnl]
或者如果您使用旧版本的hadoop:
hadoop fs -getmerge <src> <localdst> [addnl]
有关详细信息,请参阅shell guide。
至于为什么您的一个输出文件为空,数据将根据grouping comparator从Mappers传递到Reducers。如果指定两个reducer,但只有一个组(由分组比较器标识),则不会从一个reducer写入数据。或者,如果reducer中的某些逻辑阻止了写入操作,那么可能无法从一个reducer写入数据的另一个原因。
答案 2 :(得分:0)
输出文件默认名为part-x-yyyyy,其中:
任务数与集群中的物理节点数无关。对于地图任务输出,任务数由输入拆分给出。通常,reducer任务设置为job.setNumReduceTasks()
或作为输入参数传递。
具有100个减速器的作业将具有名为part-r-00000的文件到part-r-00100,每个减速器任务一个。 仅具有100个输入拆分的映射作业将具有名为part-m-00000到part-m-00100的文件,每个缩减器任务一个。