hadoop作业输出文件

时间:2016-02-26 19:14:03

标签: hadoop apache-pig oozie

我目前正在运行一个hadoop oozie工作。输出文件自动生成。预期的输出文件数量只有一个;但是,有两个输出文件叫做part-r-00000和part-r-00001。有时,第一个(part-r-00000)有数据,第二个(part-r-00001)没有数据。有时,第二个有,第一个没有。谁能告诉我为什么?另外,如何将输出文件设置为part-r-00000?

3 个答案:

答案 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,其中:

  • x要么是&#39; m&#39;或者&#39; r&#39;,具体取决于此文件是由map还是reduce任务生成的
  • yyyyy是映射器或缩减器任务编号(基于零)

任务数与集群中的物理节点数无关。对于地图任务输出,任务数由输入拆分给出。通常,reducer任务设置为job.setNumReduceTasks()或作为输入参数传递。

具有100个减速器的作业将具有名为part-r-00000的文件到part-r-00100,每个减速器任务一个。 仅具有100个输入拆分的映射作业将具有名为part-m-00000到part-m-00100的文件,每个缩减器任务一个。